Laravel: Как получить последнюю запись в группе записей с условием где? - PullRequest
1 голос
/ 01 октября 2019

У меня есть две таблицы, которые названы students и cities. Таблица students имеет первичный ключ, связанный с таблицей cities.

Таблица студентов: Students table

В веб-интерфейсе я хотел бы получить данные таблицы cities с этими требованиями:

  1. Данные таблицы students должны быть сгруппированы по city_id
  2. Если в таблице students имеется более одной записи с одинаковым city_id, выберите только самую последнюю записьгруппы.
  3. Поиск в последних записях и выбор только тех студентов, которые неактивны.

Вот функция отношения модели city:

public function student()
{
    return $this->hasOne(Student::class, 'city_id', 'id')->orderByDesc('id');
}

Это моя функция контроллера:

$data = City::whereHas('student', function($query){
              $query->where('is_active', 0)
        })->with('student')->get();

Ожидаемый результат: С учетом данных примера запрос ничего не должен возвращать.

Текущий результат: Возвращает третью строку, поскольку во втором ряду есть неактивная запись ученика. Так что в этом случае условие where не работает должным образом.

Я могу получить ожидаемый результат с помощью этого запроса SQL:

select *
  from students s
 where id = (select max(t2.id)
               from students s2
              where s.city_id = s2.city_id) AND is_active = '0';

Как я могу исправить эту логическую ошибку?

1 Ответ

0 голосов
/ 02 октября 2019

А что-то вроде этого?

public function inactiveStudent()
{
    return $this->hasOne(Student::class, 'city_id', 'id')
                ->where('is_active', 0)
                ->orderByDesc('id');
}
$data = City::whereHas('inactive_student')
            ->with('inactive_student')
            ->get();

Я не уверен, что это inactive_student или inactiveStudent, когда вы делаете запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...