Область Laravel внутри обычая, где - PullRequest
0 голосов
/ 02 июля 2019

У меня никогда не было проблем с этим, но сейчас у меня есть ситуация здесь:

В приведенном ниже коде необходимо отфильтровать некоторые данные на основе параметра запроса с именем «status», а затем использовать связанную область для фильтрации, но по какой-то причине область не работает внутри where, только снаружи.

        return Vacancy::whereCompanyId($id)
            ->where(function($query) use ($statusFilter) {
                if (!empty($statusFilter) && !empty($statusFilter['status'])) {
                    if ($statusFilter['status'] == 'published') {
                        $query->published();
                    } else if ($statusFilter['status'] == 'drafted') {
                        $query->drafted();
                    } else if ($statusFilter['status'] == 'finished') {
                        $query->where('vacancy_status_id', 3);
                    } else if ($statusFilter['status'] == 'deactivated') {
                        $query->deactivated();
                    }
                }
            })
            ->orderBy('id','DESC')
            ->paginate(3);

Область применения:

    public function scopePublished($query)
    {
        return $query->where('vacancy_status_id', '=', VacancyStatusEnum::Published);
    }

    public function scopeDraft($query)
    {
        return $query->where('vacancy_status_id', '=', VacancyStatusEnum::Draft);
    }

    public function scopeFinished($query)
    {
        return $query->where('vacancy_status_id', '=', VacancyStatusEnum::Done);
    }

    public function scopeDeactivated($query)
    {
        return $query->where('vacancy_status_id', '=', VacancyStatusEnum::Disabled);
    }

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Вы не использовали «готовый» объем.

Я обнаружил небольшое несоответствие в области «черновик», я переименовал его в:

public function scopeDrafted($query)
{
    return $query->where('vacancy_status_id', '=', VacancyStatusEnum::Draft);
}

Кроме того, я предлагаю вам немного переписать, чтобы сделать его стройнее.

return Vacancy::whereCompanyId($id)
    ->when(!empty($statusFilter['status']), function($query) use ($statusFilter) {
        $scope = $statusFilter['status'];

        $query->$scope();
    })
    ->orderBy('id','DESC')
    ->paginate(3);
0 голосов
/ 03 июля 2019

Вам необходимо использовать обратные вызовы Closure:

use Illuminate\Database\Eloquent\Builder;

 return Vacancy::whereCompanyId($id)
        ->where(function (Builder $query) use ($statusFilter) {
            if (!empty($statusFilter) && !empty($statusFilter['status'])) {
                if ($statusFilter['status'] == 'published') {
                    $query->published();
                } else if ($statusFilter['status'] == 'drafted') {
                    $query->drafted();
                } else if ($statusFilter['status'] == 'finished') {
                    $query->where('vacancy_status_id', 3);
                } else if ($statusFilter['status'] == 'deactivated') {
                    $query->deactivated();
                }
            }
        })
        ->orderBy('id','DESC')
        ->paginate(3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...