Laravel eloquent, где текущее состояние равно строке

#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 — идентификатор кандидата.