雄辩:对两个条件不同的查询结果进行分页(with()不同)

时间:2019-03-01 05:23:12

标签: laravel laravel-5 eloquent

您好Laravel程序员。


我使用Laravel 5.7,并且有4张桌子:

outlets-属于merchants,也属于多对promos

promos-属于merchants,也属于多对outlets

merchants-具有许多促销(hasMany promos,hasMany outlets)的商人列表

outlet_promo-连接outletspromos,仅存储其ID


条件1#:

每个商家的促销活动,仅在特定商店中有效,具有outlet_promo值,例如

outlet_promo
outlet_id      promo_id
    1             1

表示promo_id 1仅在outlet_id 1上有效。

条件2#:

现在,如果在所有商家的网店上进行促销活动,则表示与outlet_promo无关。 (我避免在outlet_promo表中存储太多)

获取数据

我正在尝试将所有outlets的活动promos分别设为active in some outlets onlyactive in all outlets,导致出现以下两个查询:

  1. 在所有每个销售点
  2. 中获取所有有有效促销的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');
  1. 获取所有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'); 相同。

我将非常感谢您的帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

最后我自己找到了答案。

我最终通过将查询分为两个来简化查询

首先,我同时满足所有条件。

第二,我遍历所有结果,然后在每个出口中选择每个活动促销。

因此,在这种情况下,我避免在查询中使用双with()

谢谢。