Выбор самой новой строки для каждого идентификатора в Laravel Eloquent - PullRequest
1 голос
/ 20 марта 2020

У меня есть история каждой аренды книги из библиотеки, и на основании этого я хочу показать текущий статус ВСЕХ КНИГ в библиотеке. Если у меня есть only id, book_id, status (bool) и timestamps. Как мне сделать это самым простым способом, не касаясь SQL? Я хочу иметь самую свежую запись для каждого book_id, например:

|--|-------|------|----------|
|id|book_id|status|timestamp-|
|--|-------|------|----------|
| 1|      1|     0|12.12.2019|
| 2|      2|     0|13.12.2019|
| 3|      3|     0|14.12.2019|
| 4|      2|     1|15.12.2019|
| 5|      3|     1|16.12.2019|
| 6|      3|     0|17.12.2019|
|--|-------|------|----------|

, и я хочу получить это:

|--|-------|------|----------|
|id|book_id|status|timestamp-|
|--|-------|------|----------|
| 1|      1|     0|12.12.2019|
| 4|      2|     1|15.12.2019|
| 6|      3|     0|17.12.2019|
|--|-------|------|----------|

Идеи?

Ответы [ 3 ]

0 голосов
/ 20 марта 2020

Создать отношение bookHistories внутри Book модель

// Если вам нужно извлечь истории каждой книги

public function bookHistories(){
    return $this->hasMany(BookHistory::class, 'book_id');
}

// Если вам нужно получить только одну последнюю книгу history

public function latestBookHistory(){
    return $this->hasOne(BookHistory::class, 'book_id')->orderByDesc('timestamp');
}

Теперь вы можете получить последнюю историю всех книг, например:

// Использование с will будет загружать историю последних книг для оптимизации кода

$books = Book::with('latestBookHistory')->get();

Теперь вы используете новейшую историю книг в качестве необходимого

foreach($books as $book){
    $latestBookHistory = $book->latestBookHistory;
    // If incase the latest book history is empty for the current book
    if(!empty($latestBookHistory){
        //Checking book history status of latest
        dd($latestBookHistory->status);
    }
}
0 голосов
/ 20 марта 2020

Соотношение для получения всей истории книги в вашей модели Book

public function bookHistories(){
    return $this->hasMany(BookHistory::class, 'book_id');
}

Создайте соотношение для получения последней записи для каждой книги

public function latestBookHistory(){
    return $this->bookHistories()->latest();
}

Проверьте форму вашего контроллера

$books = Book::all();
foreach($books as $book){
    if(!empty($book->$latestBookHistory) {
        //Which would return a collection, so still you have to call first()
        $latest = $book->latestBookHistory->first();
        dd($latest->id, $latest->book_id, $latest->status, $latest->created_at);
    }
}
0 голосов
/ 20 марта 2020

Вы можете использовать Laravel Collections, и это last() метод:

Пример:

$data = ModelName::all();
$last_data_object = collect($data)->last();

//try to see the object using var_dump()
var_dump($last_data_object);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...