Предложение Laravel multiple where в предложении WHERE ограничивает отношения hasMany

#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. Ух ты! и я надрываю свою задницу над этим вопросом с утра… Спасибо, Ахмед, это сработало как заклинание.