Laravel красноречиво, где первая дата равна указанной c дате - PullRequest
0 голосов
/ 30 марта 2020

У меня есть две связанные таблицы:

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();

1 Ответ

1 голос
/ 30 марта 2020

Вы не можете использовать where агрегатную функцию с groupBy, попробуйте использовать havingRaw вместо:

$projects = Project::whereHas('dates', function($query) {
   $query->havingRaw("MIN(date) = ?", ['2020-01-25']);
});
// Or
$projects = Project::whereHas('dates', function($query) {
   $query->having(DB::raw("MIN(date)"), '2020-01-25');
});

$projects = Project::whereHas('dates', function($query) {
   $query->having(DB::raw("MIN(date)"), '2020-01-25')
     ->groupBy( 'project_dates.id' ); // For sql_mode=only_full_group_by
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...