因此,我正在尝试执行按日期范围过滤的查询。问题是我还需要执行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();
}
我希望最终结果是用户所在的日期范围之间的所有促销:
b。)一个成员(具有user_id的members_promo表)。
因此,列表将全部包含在日期范围内,这是促销活动的一部分。
促销表包含我搜索的owner_id
和date
。 members_promo
表只是user_id
和promo_id
的枢纽。该问题源于orWhereHas不受日期范围的限制。因此,如果用户是不在该范围内的促销的成员,则该促销仍会在不该促销的情况下返回。
答案 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();