#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();