У меня есть две связанные таблицы:
projects
:
| id | name |
| 1 | Test |
| 2 | Example |
project_dates
:
| id | project_id | date |
| 1 | 1 | 2020-02-01 |
| 2 | 1 | 2020-02-10 |
| 3 | 1 | 2020-01-25 |
| 4 | 2 | 2020-01-10 |
| 5 | 2 | 2019-12-15 |
Теперь, например, я хотел бы получить все projects
, где первая дата project_dates
равна 2020-01-25
. Поэтому я попробовал следующее:
$projects = Project::whereHas('dates', function($query) {
$query->whereRaw("MIN(date) = '2020-01-25'");
});
Но это возвращает следующую ошибку:
SQLSTATE [HY000]: Общая ошибка: 1111 Неправильное использование групповой функции
, который возвращается к MIN(date)
. Поэтому у меня остается вопрос, как получить все проекты, в которых первая дата равна 2020-01-25
или любой другой указанной c дате. Из приведенного выше примера я бы ожидал получить проект с идентификатором 1
, поскольку первая дата 2
равна 2019-12-15
Я знаю, что можно использовать subqueryjoin
, но я чувствую, что хочу сделать 2 запроса не требуются.
$firstDates = ProjectDate::groupBy('project_id')
->selectRaw('project_id, MIN(date) as first_date');
Project::joinSub($firstDates, 'first_dates', function($join){
$join->on('first_dates.project_id', '=', 'project.id')
->where('first_date', '=','2020-01-25');
})->get();