Как проверить, нет ли в связанной таблице записи

#php #laravel #model-view-controller #laravel-query-builder

#php #laravel #model-view-controller #laravel-конструктор запросов

Вопрос:

таблица совпадений имеет связь с таблицей результатов.

Мне нужно получить все совпадения без записи в таблице результатов.

попробовал что-то, но не сработало:

 $upcomingMatch = Match::join('scores', 'matches.id', '=', 'scores.match_id')
           ->where('away_team_id', '=', '1')
           ->orWhere('home_team_id', '=', '1')
           ->where('scores.match_id', null)
           ->latest('matches.match_date')
           ->first();
 

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

1. Есть ли у вас налаженные отношения между ними? если это так, ознакомьтесь с doesntHave методом

2. Я полностью согласен с @lagbox, если у вас есть настройка отношений, то doesnHave — это стандартное и простое решение здесь. laravel.com/docs/8.x /…

Ответ №1:

Если вы используете relationship, вы можете использовать doesntHave() , но если вы используете query builder, как вы пишете в своем вопросе, вы можете использовать эти коды, я видел, что ваше условие where нуждается в некоторой корректировке для использования вложенного условия. Если вы хотите получить нулевую запись, затем используйте whereNull в scores таблице, которая не является ключом связи с matches таблицей, в этом примере я использую scores.id

Получить matches значение, равное нулю (использовать leftJoin с некоторым дополнительным условием)

 $upcomingMatch = Match::leftjoin('scores', 'matches.id', '=', 'scores.match_id')
           ->where(function ($where)
           {
               $where->where('matches.away_team_id', '=', '1')
               ->orWhere('matches.home_team_id', '=', '1');
           })
           ->whereNull('scores.id')
           ->latest('matches.match_date')
           ->first();
 

Ответ №2:

Попробуйте:

 $upcomingMatch = Match::join('scores', 'matches.id', '=', 'scores.match_id')
           ->where('away_team_id', '=', '1')
           ->orWhere('home_team_id', '=', '1')
           ->whereNull('scores.match_id')
           ->latest('matches.match_date')
           ->first();