Использовать более сложные операторы where в Scout - PullRequest
0 голосов
/ 28 января 2019

Я счастливый пользователь Laravel Scout.

Теперь я хотел бы расширить свой поиск:

        $data
            = new UserOverviewResourceCollection(User::search($searchphrase)
            ->currentStatus('active')->orderBy('lastname', 'asc')
            ->orderBy('firstname', 'asc')
            ->paginate(config('pagination.length')));

currentStatus происходит от https://github.com/spatie/laravel-model-status.

Теперь я получаю ответ, что currentStatus не поддерживается.Я подумал, что может быть хорошей идеей отфильтровать результат User :: search после того, как он будет возвращен из scout?

Еще одна идея: я хотел бы добавить более сложные выражения where:

->where([
                [
                    'starts_on',
                    '<',
                    Carbon::now()->toDateTimeString(),
                ],
                [
                    'ends_on',
                    '>',
                    Carbon::now()->toDateTimeString(),
                ],
            ])

Может быть, у вас есть идея получше?

Ответы [ 2 ]

0 голосов
/ 28 января 2019
 $data
        = new UserOverviewResourceCollection(User::search($searchphrase)
        ->currentStatus('active')->orderBy('lastname', 'asc')
        ->where(function($q){
            $query->where('starts_on', '<',Carbon::now()->toDateTimeString());
            $query->where('ends_on', '>',Carbon::now()->toDateTimeString());
         })
        ->orderBy('firstname', 'asc')
        ->paginate(config('pagination.length')));

Попробуйте этот код.Это удовлетворит ваш комплекс, где условие

0 голосов
/ 28 января 2019

Хорошо переписайте его так, как это должно работать.

 $data
            = new UserOverviewResourceCollection(User::search($searchphrase)
            ->where('starts_on','<',now())
            ->orderBy('lastname', 'asc')
            ->orderBy('firstname', 'asc')
            ->paginate(config('pagination.length')));

Обратите внимание, что now() - это просто глобальная вспомогательная функция, возвращающая текущий момент Carbon instance.Писать покороче, другой причины для этого нет.

И если вы хотите сгруппировать where запросов, вы делаете это так:

 $data
            = new UserOverviewResourceCollection(User::search($searchphrase)
            ->where(function($q) {
               $q->where('starts_on','<',now())->where('ends_on','>',now())
            })
            ->orderBy('lastname', 'asc')
            ->orderBy('firstname', 'asc')
            ->paginate(config('pagination.length')));

Итогда вы сможете экспортировать это в UserOverviewResourceCollection как локальную область , например:

public function scopeActive($q) {
    return $q->where('starts_on','<',now())->where('ends_on','>',now())
}

, и тогда вы можете использовать что-то вроде этого:

 $data
            = new UserOverviewResourceCollection(User::search($searchphrase)
            ->active()
            ->orderBy('lastname', 'asc')
            ->orderBy('firstname', 'asc')

Я написал это из своей головы, поэтому могут быть опечатки.

...