或在哪里取消了我的其他“哪里”条件

时间:2019-05-21 20:14:54

标签: laravel eloquent

因此,我正在尝试执行按日期范围过滤的查询。问题是我还需要执行orWhereHas查询,而该查询当前未遵循我的whereBetween查询。

所以我有2个表Promos和Member_Promo。为了给用户提供即将到来的促销,我使用了Auth::user()->upcomingPromos('ytd')之类的功能。该函数如下所示:

public function upcomingPromos($type)
    {
        switch ($type) {
            case 'ytd':
                $range = [Carbon::today(), Carbon::now()->endOfYear()];
                break;

            case 'mtd':
                $range = [Carbon::today(), Carbon::now()->endOfMonth()];
                break;
        }


        return Promo::where('owner_id', $this->id)
            ->whereBetween('date', $range)
            ->orWhereHas('members', function ($query) {
                $query->where('user_id', $this->id);
            })
            ->oldest('date')
            ->get();
    }

我希望最终结果是用户所在的日期范围之间的所有促销:

  • a。)所有者(带有owner_id的促销表)
  • b。)一个成员(具有user_id的members_promo表)。

    因此,列表将全部包含在日期范围内,这是促销活动的一部分。

促销表包含我搜索的owner_iddatemembers_promo表只是user_idpromo_id的枢纽。该问题源于orWhereHas不受日期范围的限制。因此,如果用户是不在该范围内的促销的成员,则该促销仍会在不该促销的情况下返回。

1 个答案:

答案 0 :(得分:0)

get()替换toSql()对于调试这类查询问题确实非常方便-它会向您显示由查询生成器调用呈现和执行的SQL。

在您的情况下,将要OR的两个参数一起包装在where(function($query) { })中就可以了。在后台,这将两个条件放在结果查询的括号中。

return Promo::where('owner_id', $this->id)
    ->where(function($q) use ($range) {
        $q->whereBetween('date', $range)
            ->orWhereHas('members', function ($query) {
                $query->where('user_id', $this->id);
            });
    })
    ->oldest('date')
    ->get();