您好Laravel程序员。
我使用Laravel 5.7,并且有4张桌子:
outlets
-属于merchants
,也属于多对promos
promos
-属于merchants
,也属于多对outlets
merchants
-具有许多促销(hasMany promos
,hasMany outlets
)的商人列表
outlet_promo
-连接outlets
和promos
,仅存储其ID
每个商家的促销活动,仅在特定商店中有效,具有outlet_promo
值,例如
outlet_promo
outlet_id promo_id
1 1
表示promo_id
1仅在outlet_id
1上有效。
现在,如果在所有商家的网店上进行促销活动,则表示与outlet_promo
无关。 (我避免在outlet_promo
表中存储太多)
我正在尝试将所有outlets
的活动promos
分别设为active in some outlets only
和active in all outlets
,导致出现以下两个查询:
outlets
促销活动及其促销
$outlets_all = Outlet::with(['merchant.promos' => function ($q) {
$q->doesntHave('outlets');
}])->whereHas('merchant.promos', function ($q) {
$q->whereDate('start_date', '<=', date('Y-m-d'));
})->doesntHave('promos.outlets');
outlets
处有有效促销的促销,而其促销仅在选定的商店 $outlets_selected = Outlet::with(['merchant.promos' => function ($q) {
$q->has('outlets');
}])->whereHas('promos', function ($q) {
$q->whereDate('start_date', '<=', date('Y-m-d'));
});
关键区别在于with
的情况
在这两个查询中,我设法获得了所需的输出。但是现在的目标是我要同时对两个对象都进行分页操作,因此我可以使用AJAX将视图中的outlets
延迟加载。我想显示具有outlets
(所有出口或选定出口)的promos
的列表以及出口具有的活动promos
的列表。
我试图同时进行union()
和unionAll()
这两个查询,从而得出正确的出口,但是来自promos
的{{1}}列表有误。工会的行动似乎弄乱了宣传。每个商人的促销似乎都具有相同的价值,但实际上它们应该是不同的。
我什至尝试将查询与两个merchant.promos
操作合并,如下所示:
with()
它的结果与我之前做过的$merge = Outlet::with(['merchant.promos' => function ($q) {
$q->has('outlets');
}], ['merchant.promos' => function ($q) {
$q->doesntHave('outlets');
}])->whereHas('promos', function ($q) {
$q->whereDate('start_date', '<=', date('Y-m-d'));
})->orWhereHas('merchant.promos', function ($q) {
$q->whereDate('start_date', '<=', date('Y-m-d'));
})->doesntHave('promos.outlets');
相同。
我将非常感谢您的帮助。谢谢。
答案 0 :(得分:0)
最后我自己找到了答案。
我最终通过将查询分为两个来简化查询
首先,我同时满足所有条件。
第二,我遍历所有结果,然后在每个出口中选择每个活动促销。
因此,在这种情况下,我避免在查询中使用双with()
。
谢谢。