Ограничение количества красноречивых отношений

#php #laravel-5 #eloquent #eloquent-relationship

#php #laravel-5 #красноречивый #eloquent-relationship

Вопрос:

Я пытаюсь написать красноречивый запрос, который будет работать следующим образом:

 Tables:
Order
Support Ticket (one to many with the order)
  

Запрос:
Фильтруйте обращения в службу поддержки и показывайте заказ только в том случае, если обращению в службу поддержки менее 45 дней.

Я чувствую, что это было бы адаптацией метода whereHas() в Laravel, но я не уверен, как реализовать фильтр или поиск по дате для таких отношений.

Спасибо!

Ответ №1:

 $orders = Order::whereDoesntHave('support_ticket')
    ->orWhereHas('support_ticket', function($query) {
        $query->where('created_at', '>=', now()->subDays(45));
    })->get();
  

Где «support_ticket» — это имя отношения в вашей модели заказа.
Таким образом, вы можете получить заказы, у которых нет обращения в службу поддержки или которые имеют по крайней мере один и менее 45 дней.

Поскольку вы находитесь в Laravel 5, возможно, now() не определен, тогда вы можете использовать:

 IlluminateSupportCarbon::now()
  

Комментарии:

1. Большое спасибо. Я вижу, что это вынуждает к тому, что в заказе должен быть хотя бы один билет. Есть ли способ использовать это в условном? Например, «если у него есть билет, он должен быть в течение последних 45 дней»

2. думаю, я понял это, я могу добавить «whereDoesntHave», а затем выполнить «orWhereHas»

3. Да, именно так! Дайте мне знать, если вы поняли это!

4. @ackerchez отредактировал ответ, скажите мне, сработало ли это! Может быть, вы можете отредактировать вопрос, чтобы все было очищено!