Здравствуйте, программист 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
, что приводит меня к этому двум запросам:
- Получение всех
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
, который я делал раньше.
Я буду чрезвычайно благодарен за любую помощь.Спасибо.