#mysql #laravel #eloquent
Вопрос:
У меня есть следующий вопрос…
$pgcs = PrivateGuard::with(['licences', 'state'])
->whereHas('licences', function($query){
$query->whereDate('expiration_of_licence', '<', Carbon::today())
->where('renewal', 0);
})
->where('status', 1)
->get();
Я хочу получить $pgcs с лицензиями, которые удовлетворяют вышеуказанным условиям, где дата работает правильно, но где(«продление», 0), похоже, работает неправильно.
Приведенный выше запрос получает $pgc с лицензиями, у которых также есть продление, равное 1, хотя у того же $pgc также есть лицензии со значением продления 0 и еще одна со значением 1, я не хочу, чтобы в этом запросе был получен $pgc, у которого есть какая-либо лицензия со значением продления 1. что мне делать?
Ответ №1:
ваши дела таковы
- [1] pgc .. имеет две или более лицензий с продлением 0 , 1
- [2] pgc .. имеет две или более лицензий с продлением 0 , 0
- [3] pgc .. имеет две или более лицензий с продлением 1 , 1
прямо сейчас ваш запрос получает pgcs для случаев [1],[2]
поэтому вам придется немного изменить логику запроса, чтобы получить только [2]
$pgcs = PrivateGuard::with(['licences', 'state'])
->whereHas('licences', function($query){
$query->whereDate('expiration_of_licence', '<', Carbon::today())
->where('renewal', 0);
})
->whereDoesntHave('licences', function($query){
$query->where('renewal', 1);
})
->where('status', 1)
->get();
Комментарии:
1. Ух ты! и я надрываю свою задницу над этим вопросом с утра… Спасибо, Ахмед, это сработало как заклинание.