Последние обновления в Laravel - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть список книг в моей базе данных, и у каждой книги есть главы.мои модели

Books.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
    protected $guarded = [];

    public function chapters()
    {
        return $this->hasMany(Chapter::class);
    }
}

Chapter.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Chapter extends Model
{
    protected $guarded = [];

    public function book()
    {
        return $this->belongsTo(Book::class);
    }
}

Как сделать страницучто будет показывать книги по порядку от последних до старых?Кроме того, порядок основан на обновлении или добавлении главы в книгу.Если одна из старых книг обновляется путем добавления еще 1 главы, эта книга будет отображаться первой из самых последних обновленных книг.Спасибо!

Я использую Laravel 5.6 и Vue JS

1 Ответ

0 голосов
/ 12 декабря 2018

Вариант 1:

Вы должны использовать объединения в запросе:

$books = Books::select('books.*')
    ->leftJoin('chapters', 'chapters.book_id', '=', 'books.id')
    ->groupBy('books.id')
    ->orderByDesc('chapters.updated_at')
    ->get();

Вариант 2:

Есливам не нужно разбивать на страницы и показывать все книги на одной странице, вы можете попробовать отсортировать коллекцию по значению отношения.

Добавить отношение latestChapter:

public function latestChapter()
{
    return $this->hasOne(Chapter::class)->orderByDesc('updated_at');
}

Получить и отсортировать:

$books = Books::with('latestChapter')->get();

$books = $books->sortByDesc(function($item){
        return $item->latestChapter ? $item->latestChapter->updated_at : '1970-01-01';
    });
...