我从来没有问题,但是现在我遇到了一个问题:
下面的代码需要基于名为'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);
}
我在做什么错了?
答案 0 :(得分:1)
您未使用“完成”范围。
我在“草稿”范围内发现了一个小的不匹配项,将其重命名为:
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);
答案 1 :(得分:0)
您需要使用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);