Красноречивый подзапрос, если строка является самой последней - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть следующий подзапрос:

->whereHas('statuses', function($query){
           $query->where('status_id', request('status'));
})->orderBy(...)->paginate();

Для простоты я скрыл полный запрос. Допустим, у меня есть сводная таблица user_status. У пользователя много статусов, и у статуса может быть много пользователей (я знаю, что это необычно. Просто рассмотрим это в качестве примера). Поэтому, когда я запрашиваю сводную таблицу user_status, как описано выше, я получаю те строки, которые имеют запрошенный идентификатор статуса. Но я также хочу добавить ограничение, что строка должна быть самой последней для этого конкретного пользователя (не во всей таблице). Вот как выглядит таблица user_status:

+---------+-----------+---------------------+
| user_id | status_id | created_at          |
+---------+-----------+---------------------+
|       1 |         1 | 2018-09-03 18:39:14 |
|       1 |         8 | 2018-09-03 18:51:42 |
+---------+-----------+---------------------+

В этом сценарии, если запрошенный status равен 1, я не хочу, чтобы эта строка возвращалась, поскольку status_id 1 не самая последняя для user_id 1 (см. Разницу во времени) в столбце create_at).

Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Я определяю отношение в пользовательской модели как: -

public function latest_statuses() {
        return $this->hasMany(Status::class,'user_id','id')->orderBy('created_at','DESC')->take(1);
}

И после этого письменный запрос в виде: -

$status = \App\User::with('latest_statuses')->whereHas('latest_statuses', function($query){
           return $query->where('status_id', 1);
        })->get();

У меня это работает.

0 голосов
/ 04 сентября 2018

Этого можно добиться, используя другое условие для вложенного запроса.

->whereHas('statuses', function($query){
       $query->where('status_id', request('status'))
             ->whereIn('user_status.id', function($query) {
                $query->selectRaw('MAX(id)')
                      ->from('user_status')
                      ->groupBy('user_id');
             });
})->orderBy(...)->paginate();

Вложенный запрос выберет только последние строки (при условии, что user_status.id равен auto-increment)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...