Я пытаюсь получить последнее значение журнала входа моего пользователя, но не могу сделать это с помощью этого кода:
DB::table('users')
->leftJoin('login_logs', 'login_logs.id', '=', function($query) {
$query->select('login_logs.id')
->where('users.id', '=','login_logs.user_id')
->orderBy('login_logs.created_at')
->limit(1);
})->get();
У меня есть 2 таблицы пользователей и журнал входа. Я хочу получить всех пользователей с последним журналом входа. Может кто-нибудь мне помочь? Я новичок в Laravel.
Редактировать: я получил этот код для sql:
SELECT c.*, o.*
FROM users c
INNER JOIN login_logs o ON o.id = (
SELECT id
FROM login_logs
WHERE login_logs.users_id = c.id
ORDER BY id DESC
LIMIT 1)
Edit2: этот код работает для меня
DB::table('users')
->leftJoin('login_logs', 'login_logs.id', '=', (DB::RAW('(
SELECT id FROM login_logs
WHERE login_logs.user_id = users.id
ORDER BY login_logs.id DESC
LIMIT 1)')))
->select('users.*','login_logs.created_at as lastLogin','login_logs.type')
->get()
какие-нибудь лучшие идеи ?:
Я использую таблицы данных github.com/yajra/laravel-datatables, и это не работает с моделями :(


Попробуйте что-то вроде этого:
DB::table('users')
->join('login_logs', 'login_logs.user_id', '=', 'users.id')
->order_by('login_logs.id', 'desc')
->first();
он возвращает только один, я хочу вернуть всех пользователей с последней датой входа в систему
удалить -> первый ()
Чтобы получить последнюю запись из таблицы журнала входа в систему для каждого пользователя, вы можете использовать следующий самосоединенный запрос
select u.*, l.*
from users u
join login_logs l on u.id = l.user_id
left join login_logs l1 on l.user_id = l1.user_id
and l.created_at < l1.created_at
where l1.user_id is null
Используя построитель запросов, вы можете переписать его как
DB::table('users as u')
->select('u.*', 'l.*')
->join('login_logs as l', 'u.id', '=', 'l.user_id')
->leftJoin('login_logs as l1', function ($join) {
$join->on('l.user_id', '=', 'l1.user_id')
->whereRaw(DB::raw('l.created_at < l1.created_at'));
})
->whereNull('l1.user_id')
->get();
Laravel Eloquent выбирает все строки с max created_at
Laravel - получить последнюю запись каждого типа UID
Группа Laravel Eloquent по последней записи
спасибо за ответ, это мой sql-код, работающий SELECT c. *, o. * FROM users c INNER JOIN login_logs o ON o.id = (SELECT id FROM login_logs WHERE login_logs.users_id = c.id ORDER BY id DESC LIMIT 1 ) как я могу использовать его в laravel?
@JarloyzJuarez, почему вы хотите запустить этот запрос вместо того, что я указал в своем ответе, попробуйте и позвольте мне, если вы все еще не получаете нужные данные или в случае ошибки
извините за это, ваш код не работает, код возвращает весь журнал входа для каждого пользователя
@JarloyzJuarez Я сомневаюсь, что это не может быть правдой.Также вы можете оказать нам услугу и включить образец набора данных для ваших таблиц и определений таблиц с помощью sqlfiddle.com или любого другого онлайн-инструмента, или, возможно, вы можете добавить в свой вопрос, чтобы я могу проверить то, что вы сказали правильно или нет
о, ребята, извините, я вижу свою ошибку, некоторые из моих журналов данных имеют такое же datetime, и это было причиной того, почему ваш запрос не работал, я исправил изменение идентификатора l.created_at <l1.created_at для l.id <l1.id Большое спасибо
Попробуйте этот код. Внутренний запрос предоставит информацию о вашем последнем входе в систему каждого пользователя и присоединится к нему по таблице (Id) с LEFT JOIN. Таким образом, он ответит только на необходимые данные вашего пользователя. Вы можете добавить, наконец, WHERE CONDITION, чтобы получить информацию о конкретном идентификаторе (пользователя)
SELECT U.ID,
LOGS.CREATED_AT
FROM USERS AS U
LEFT JOIN
(
SELECT ID,
MAX(CREATED_AT) AS CREATED_AT
FROM LOGIN_LOGS
GROUP BY ID
) AS LOGS
ON LOGS.ID = U.ID
--WHERE U.ID='your_user_id'
Надеюсь, что это поможет вам.
спасибо за ответ, у меня этот код работает SELECT c. *, o. * FROM users c INNER JOIN login_logs o ON o.id = (SELECT id FROM login_logs WHERE login_logs.users_id = c.id ORDER BY id DESC LIMIT 1)
ORDER BY замедлит ваш запрос. В настоящее время, возможно, вы работаете с Test Data. Но отсутствие данных снизит вашу производительность в соотношении 30:70.
спасибо за ответ, что вы думаете по этому поводу? ВЫБРАТЬ c. *, O. * ИЗ пользователей c ВНУТРЕННЕЕ СОЕДИНЕНИЕ login_logs o ON o.id = (ВЫБРАТЬ MAX (id) FROM login_logs ГДЕ login_logs.user_id = c.id ГРУППА ПО login_logs.user_id);
в настоящее время вы собираетесь делать 3 шага ▼ usres [id] → login_logs [id] → login_logs [user_id]. Я даю вам ярлык, чтобы действовать быстро. ▲ usres [u_id] → login_logs [u_id]. Теперь вы выбираете, что кажется лучше.
Вы знакомы с моделями и отношениями Eloquent?