У меня есть область, которая выбирает первый результат для группы для набора результатов.
public function scopeFirstPerGroup(Builder $query, ?array $fields = null, string $by = 'id'): Builder
{
return $query->whereIn('id', function (QueryBuilder $queryBuilder) use ($fields, $by, $query) {
return $queryBuilder->from(static::getTable())
->selectRaw("min(`$by`)")
->groupBy($fields ?? static::$groupedScopeFields);
});
}
Это работает, но не учитывает другие условия, которые были настроены в родительском запросе. , Например, сгенерированный вывод SQL:
select * from `queue_jobs` where `started_at` is null and `id` in (select min(`id`) from `queue_jobs` group by `throttle_groups`) order by `id` asc
Но когда к родительскому запросу добавлено следующее whereNull:
QueueJob::orderBy('id')
->whereNull('started_at')
->firstPerGroup(['throttle_groups'])
->get();
Вместо него должно быть:
select * from `queue_jobs` where `started_at` is null and `id` in (select min(`id`) from `queue_jobs` WHERE `started_at` IS NULL group by `throttle_groups`) order by `id` asc
В рамках объема мне нужно каким-то образом получить whereNull('started_at')
(вместе с любыми другими условными обозначениями, которые могут быть добавлены. Мне каким-то образом нужно поместить эти условные обозначения в прокомментированную строку ниже, но я не уверен, как.
public function scopeFirstPerGroup(Builder $query, ?array $fields = null, string $by = 'id'): Builder
{
return $query->whereIn('id', function (QueryBuilder $queryBuilder) use ($fields, $by, $query) {
return $queryBuilder->from(static::getTable())
//->where... (I need to add in the the whereNull and whereType from parent query)
->selectRaw("min(`$by`)")
->groupBy($fields ?? static::$groupedScopeFields);
});
}