У меня есть такой метод контроллера:
public function awaiting()
{
$producers = Producer::where('producer_process',4)->get();
$producers_list = [];
foreach($producers as $producer){
if($producer->brand->brand_rejected == 0){
array_push($producers_list, $producer);
}
}
return view('admin.brands.awaiting', compact('producers_list'));
}
Таким образом, в основном существует связь Один к одному между Producer
моделью и Brand
моделью.
Чтобы получить набор brands
записей таблицы, который имеет producer_process
из 4, а ТАКЖЕ поле brand_rejected
связанной brands
записи таблицы должно быть установлено на 0, я добавил array_push
и проверил условие.
Теперь это работает нормально и правильно показывает правильные данные, но я хотел знать, как это можно сделать с помощью отношений Eloquent?
Я имею в виду, есть ли какой-нибудь краткий и полезный метод, написанный в отношениях Eloquent, который может сделать это без использования array_push
или другого цикла foreach
?
Вы можете попробовать это:
public function awaiting()
{
$producers = Producer::where('producer_process',4)
->with('brand', function($q) {
$q->where('brand_rejected', 0);
})->get();
// dd($producers);
dd($producers->pluck(brand));
Конечно, вы можете использовать метод with()
также с предложением where()
, чтобы применить некоторые условия к отношениям.
Пример
$yourQuery->with('brand', function($query){
$query->where('brand_rejected', 0);
});
проверьте это для получения дополнительной информации
https://laravel.com/docs/9.x/eloquent-relationships#constraining-eager-loads
Я надеюсь, что это полезно
Вы можете использовать whereHas
, чтобы ограничить набор результатов на основе существования отношения. Здесь мы говорим, что нам нужны только производители, у которых поле «product_process» установлено на 4, а бренд с полем «brand_rejected» установлен на 0:
$producers = Producer::where('producer_process', 4)
->whereHas('brand', function ($q) { $q->where('brand_rejected', 0); })
->get();
Если вы хотите, чтобы у этих производителей были загружены отношения с брендами, вы должны с готовностью загрузить их. Перед вызовом get
вы можете указать ему загрузить отношения:
$producers = Producer::where(...)->whereHas(...)->with('brand')->get();
Laravel 5.8 Docs - Eloquent - Отношения - Запрос существования отношенийwhereHas
Laravel 5.8 Docs - Eloquent - Отношения - Нетерпеливая загрузкаwith