#mysql #laravel #eloquent
#mysql #laravel #красноречивый
Вопрос:
У меня есть кандидат и таблица состояния, в которой у каждого кандидата есть несколько статусов. при изменении статусов будет создана новая строка в таблице статусов для хранения нового статуса. Поэтому, когда пользователь хочет отфильтровать кандидатов по статусу, я хочу выбрать кандидатов, чтобы их текущий статус соответствовал тому, что пользователь выбирает, а не статусам all before. мой запрос :
$status = $request->get('status');
$q->where(function ($q) use ($status) {
$q->orWhereHas('statuses', function ($q) use ($status) {
$q->where('status', 'like', "%" . $status . "%");
});
});
Ответ №1:
Я изменил запрос на blow, и он работает нормально.
$q->whereRaw('status LIKE "%'.$status.'%" AND id=(select max(id) from statuses WHERE status LIKE "%'.$status.'%")');
Редактировать:
Приведенный выше запрос имеет проблему, и это только первый соответствующий кандидат get, а не все из них, поэтому я изменил запрос на это:
$q->where(function ($q) use ($status) {
$q->orWhereHas('statuses', function ($q) use ($status) {
$q->whereRaw('status LIKE ? AND id IN (SELECT MAX(id) FROM statuses GROUP BY candidate_id)',["%".$status."%"]);
});
});
Комментарии:
1. Вот как происходит внедрение SQL.
2. Я знаю это, но статус не извлекается непосредственно от пользователя.
Ответ №2:
мое восприятие таково, что текущий статус кандидата — это последняя запись. я говорю о направлении mysql, что касается вашей миграции и моделирования, реализуйте это.
select * from status
where id =(
select max(id) from status
where candidate_id= x
)
x — идентификатор кандидата.