Создать дополнительную связь в User
модели, которая возвращает желаемый результат. Для этого вам понадобятся отношения 1-1.
/**
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function inactiveBookStillLatestPerUser()
{
return $this->hasOne(Book::class)->where(['status' => 'inactive', 'id' => function (\Illuminate\Database\Query\Builder $nested) {
$nested->from('books as nested')
->selectRaw('max(id)')
->whereRaw('nested.user_id = books.user_id');
}]);
}
Затем где-нибудь в коде (т. Е. В контроллере) вы вызываете его с помощью
$users = User::has('inactiveBookStillLatestPerUser')->get();
// or if books are needed too
// $users = User::has('inactiveBookStillLatestPerUser')->with(['inactiveBookStillLatestPerUser'])->get();
Я использовал id
последний заказ [max(id)
] в подзапросе, чтобы избежать нежелательного результата, если один пользователь сделал групповую вставку нескольких книг в один и тот же момент времени и когда все эти книги будут иметь одинаковое время вставки, так что последний для каждого созданного_этапа, возможно, не будет наиболее точным. Но вы можете сделать то же самое, вместо этого:
/**
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function inactiveBookStillLatestPerUser()
{
return $this->hasOne(Book::class)->where(['status' => 'inactive', 'created_at' => function (\Illuminate\Database\Query\Builder $nested) {
$nested->from('books as nested')
->selectRaw('max(created_at)')
->whereRaw('nested.user_id = books.user_id');
}]);
}
Возможно, второй пример в порядке, но первый пример с id
будет работать нормально.