Eloquent: Paginate Two Query Result с разными условиями (различается с ()) - PullRequest
0 голосов
/ 01 марта 2019

Здравствуйте, программист Laravel.


Я нахожусь на Laravel 5.7 и у меня 4 таблицы:

outlets - принадлежит merchants, также принадлежит ToMany promos

promos - принадлежит To merchants, также принадлежит ToMany outlets

merchants - список продавцов, которые имеют много рекламных акций (hasMany promos, hasMany outlets)

outlet_promo - соединяет outlets и promos, хранят только их идентификаторы


Условие 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 onlyи active in all outlets, что приводит меня к этому двум запросам:

  1. Получение всех 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

Цели

В рамках этих двух запросов мне удалось получить желаемый результат.Но теперь цель состоит в том, чтобы я хотел, чтобы paginate оба приводили к одному объекту, поэтому я могу лениво загрузить outlets в представление, используя AJAX.Я хочу отобразить список outlets, который имеет promos (все розетки или выбранные розетки) со списком активных promos, который имеет розетка.

Что я пробовал до сих пор

Я попытался union() и unionAll() оба запроса, в результате правильные выходы, но неверный список promos из 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');

И это просто приводит ктак же, как и union, который я делал раньше.

Я буду чрезвычайно благодарен за любую помощь.Спасибо.

1 Ответ

0 голосов
/ 02 марта 2019

Наконец-то я нашел ответ сам.

В итоге я упростил запрос, разделившись на два запроса, где

Во-первых, я получаю все выходы с обоими условиями.

Во-вторых, я перебираю все результаты, затем выбираю каждое активное продвижение в каждом из них.

Так что в этом случае я избегаю двойного with() в своем запросе.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...