Условие только для последней записи в отношении hasMany в laravel - PullRequest
0 голосов
/ 02 мая 2020

У меня есть две таблицы users и users_logs.

Таблица users_logs связана с users с помощью user_id.

Таблица users_logs может иметь несколько записей против разных пользователей, например 100 записей могут иметь против одного user_id.

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

Я также создал отношение hasMany в таблице users.

public function users_logs_details(){
    return $this->hasMany('App\UsersLog', 'user_id', 'id');
}

Код, который я пробовал:

$users = User::with(['users_logs_details'])
            ->whereHas('users_logs_details', function($query) {
                return $query->where('status', '=', 1)->latest()->take(1);
            })->get();

Но я не получаю желаемого результата, потому что этот запрос проверяет все записи в таблице users_logs, но я хочу проверить только самую последнюю запись. Если статус = 1 действителен для любой записи пользователя в users_logs таблица затем возвращает запись, но я хочу проверить статус = 1 только в последней записи, если статус = 0 в последней записи (независимо от того, равен ли он 1 в старой записи), он не должен возвращать результат для этой записи. Пожалуйста, помогите, я был бы очень благодарен.

Примечание: изображения только для справки

enter image description here

enter image description here

1 Ответ

0 голосов
/ 03 мая 2020

Соединение подзапросом может быть вашим решением. Присоединение по подзапросу выберет только последний журнал событий, объединит его с пользователями и отфильтрует по необходимому вам статусу. Чтобы избежать неоднозначности пользовательских полей, выберите только пользовательские поля.

User::leftJoinSub(
    UsersLog::whereColumn('users_logs.user_id', 'users.id')
        ->latest()
        ->limit(1),
    'users_logs',
    'users_logs.user_id',
    'users.id'
)->where('users_logs.status', 1)
->select('users.*')
->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...