SQL выберите показать таблицу, если не совпадает значение из другой таблицы (Laravel)

#php #laravel #laravel-8

#php #laravel #laravel-8

Вопрос:

Это мой запрос, я попробовал этот запрос, он работает.

 SELECT * 
FROM conference_venue 
WHERE id_venue NOT IN (SELECT id_venue FROM submission_data WHERE id_submission = 1);
 

я хочу отобразить данные в conference_venue. но я не хочу отображать данные, id_venue которых совпадает с таблицей submission_data (такой же, как id_venue, id_submission которого упоминается).

Я пытаюсь сделать запрос для версии laravel, но это пустой белый экран без ошибок.

 DB::table('conference_venue')
    ->whereNotIn('id_venue', function($q){
      $q->select('id_venue')
      ->from('submission_data')
      ->where('id_submission', '=', 1);
    })->select('*')->get();
 

Этот запрос работает, когда я пытаюсь его выполнить в консоли запросов sql, но терпит неудачу, когда я пытаюсь его выполнить с помощью Laravel query builder.

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

1. Вы отладили ее? dd($query);

2. пустой экран означает, что он возвращает NULL

3. убедитесь, что запрос ДОЛЖЕН возвращать некоторые данные или запрос получает пустой результат

4. случай : gist.github.com/rizkytegar/5ee2d19662cb6cfc654cbe06a6435bdb

Ответ №1:

Вы можете попробовать это:

 DB::table('conference_venue')
     ->select('*')
     ->whereRaw(
     'conference_venue.id_venue NOT IN (SELECT submission_data.id_venue FROM submission_data WHERE id_submission = 1)'
     );
 

Или, что еще лучше, создайте модель для conference_venue and submission_data (т. Е.: ConferenceVenue , SubmissionData ), и вы можете добавить красноречивые отношения для ConferenceVenue and SubmissionData .

Отношения Eloquent, которые поддерживают множество общих отношений (один к одному, один ко многим, многие ко многим и т.д.), Определяются как методы в ваших классах моделей Eloquent. Поскольку отношения также служат мощными конструкторами запросов, определение отношений как методов предоставляет мощные возможности цепочки методов и запросов.

Красноречивый: отношения

В вашем ConferenceVenue классе вы можете добавить метод, похожий на следующий:

 public function available() {
     return this->hasMany(SubmissionData, 'id_venue')
          ->select('*') // You can also specify relevant columns ONLY
          ->whereRaw(
               'conference_venue.id_venue NOT IN (SELECT submission_data.id_venue FROM submission_data WHERE id_submission = 1)'
          );
}
 

Где вы можете использовать метод взаимосвязи следующим образом:

 $available = ConferenceVenue::with('available')->get();