2 модели. User и UserActions (один ко многим).
Таблица user_actions имеет поля: id, user_id и action
определено отношение в классе User
public function userActions(): HasMany
{
return $this->hasMany(User::class)->orderBy('id');
}
дополнительно определено отношение, которое возвращает мне самую последнюю запись по пользователю из UserActions
public function userActions(): HasMany
{
return $this->hasMany(User::class)->latest()->take(1);
}
И вот с такими исходными данными нужно отфильтровать Пользователей по последнему их действию.
Например, если в фильтр пришло значение 'show', то нужно выдать всех пользователей, у которых последняя запись в таблице user_actions имеет action === 'show'
😔😔 help
https://t.me/laravel_web/984541 если не ошибаюсь то этот вариант может помочь https://t.me/laravel_web/984541
да чё-т не похоже... Я вот так пробовал $this->whereHas('userActions', function ($query) use ($value) { return $query->where('action', '=', $value); }); но это поиск не по последней записи, а вообще по всем записям из таблицы user_actions, которые относятся к конкретному юзеру. Вот как это ограничить проверкой лишь последней записи??
через подзапрос, билдером вроде не получится. либо пакет для лимита в связях посмотреть, но я не уверен получится ли с ним.
made in chatgpt $usersWithLastUserActionX = DB::table('users') ->join('user_actions', 'users.id', '=', 'user_actions.user_id') ->select('users.*') ->where('user_actions.action', '=', $value) ->whereRaw('user_actions.created_at = (SELECT MAX(created_at) FROM user_actions WHERE user_id = users.id)') ->get();
но.. я мб выбрал б все экшены по ключу и сгрупировал бы по юзеру, получил бы в итоге $userIds и с этим фильтровал whereIn()
Обсуждают сегодня