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 函数中使用函数作为参数:-&gt;where(function ($q) use ($date) ) on $q 您可以使用 where()orWhere() 查看“逻辑分组”的文档:laravel.com/docs/8.x/queries#logical-grouping。它可以让你做return $query-&gt;where(function($subQuery) ... )-&gt;orWhere(function($subQuery) ... )-&gt;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中的Query Builder

Laravel中的Query Builder

Laravel:调用未定义的方法 Illuminate\\Database\\Query\\Builder

laravel 5.2 调用未定义的方法 Illuminate\Database\Query\Builder::associate()

“使用 Laravel 调用未定义的方法 Illuminate\\Database\\Query\\Builder::users() [关闭]