Laravel - Повторное использование параметров eloquent Builder в области действия построителя запросов - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть область, которая выбирает первый результат для группы для набора результатов.

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);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...