Laravel Query builder / Scope question 这里满足同一范围内多个条件的要求
Posted
技术标签:
【中文标题】Laravel Query builder / Scope question 这里满足同一范围内多个条件的要求【英文标题】:Laravel Query builder / Scope question here meet requirements for multiple conditions in the same scope 【发布时间】:2021-12-02 22:01:10 【问题描述】:所以我接手了一个项目,现在不幸的是,我公司的所有者希望我们的整个搜索(整个 dang web 应用程序的构建方式)以不同的方式运行。目前,我们的范围仅限于活跃的包机,然后是一些其他条件(将保持不变)。我现在需要创建一个满足以下 3 个要求的活动范围:
active = true 并且 snooze_dates 为空 active = true snooze_dates 不为空,但传入的 $date 不在 snooze_start/end 范围内 active = false 并且 snooze_dates 不为 null 并且传入的 $date 具有比 snooze_end_date 更大的值(此时将激活章程)
public function scopeActiveWithSnooze($query, $date)
$qOne = $query->where('active', true)
->where('snooze_start_date', null)
->where('snooze_end_date', null);
//OR THIS
$qTwo = $query->where('active', true)
->where('snooze_end_date', '!=', null)
->whereDate('snooze_end_date', '<=', $date)
->orWhereDate('snooze_start_date', '>=', $date);
//OR THIS
$qThree = $query->where('active', false)
->where('snooze_end_date', '!=', null)
->whereDate('snooze_end_date', '<=', $date);
这是范围的想法,但我怎样才能使所有条件都起作用?
【问题讨论】:
那么您需要将 3 个查询合二为一吗?您可以在 where 函数中使用函数作为参数:->where(function ($q) use ($date) )
on $q
您可以使用 where()
和 orWhere()
查看“逻辑分组”的文档:laravel.com/docs/8.x/queries#logical-grouping。它可以让你做return $query->where(function($subQuery) ... )->orWhere(function($subQuery) ... )->orWhere(function($subQuery) ... );
,用你的where子句组替换每个...
。
请编辑标题以便简要描述问题
【参考方案1】:
为此使用逻辑分组
public function scopeActiveWithSnooze($query, $date)
return $query->where(function ($query)
$query->where('active', true)
->whereNull('snooze_start_date')
->whereNull('snooze_end_date');
)->orWhere(function ($query) use ($date)
$query->where('active', true)
->whereNotNull('snooze_end_date')
->where(function ($query) use ($date)
$query->whereDate('snooze_end_date', '<=', $date)
->orWhereDate('snooze_start_date', '>=', $date);
);
)->orWhere(function ($query) use ($date)
$query->where('active', false)
->whereNotNull('snooze_end_date')
->whereDate('snooze_end_date', '<=', $date);
);
https://laravel.com/docs/8.x/queries#logical-grouping
https://laravel.com/docs/8.x/eloquent#local-scopes
【讨论】:
我不确定,但function($query)
不会因为 $query 变量存在于范围内而产生问题吗?
我觉得自己很笨,但是是的,逻辑分组非常有意义。非常感谢,这应该很容易解决。以上是关于Laravel Query builder / Scope question 这里满足同一范围内多个条件的要求的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 查询错误 - 调用未定义的方法 Illuminate\Database\Query\Builder::query()
Laravel:调用未定义的方法 Illuminate\\Database\\Query\\Builder
laravel 5.2 调用未定义的方法 Illuminate\Database\Query\Builder::associate()
“使用 Laravel 调用未定义的方法 Illuminate\\Database\\Query\\Builder::users() [关闭]