Как проверить реляционные данные коллекции перед отправкой на просмотр

У меня есть такой метод контроллера:

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?

Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Что нового в PHP 8.1?
Что нового в PHP 8.1?
Если вы все еще используете PHP 7, то эта статья для вас. В PHP 8, а именно в PHP 8.1, встроены некоторые очень востребованные функции, которые вам...
Разработка LMS на заказ для повышения эффективности работы и обучения
Разработка LMS на заказ для повышения эффективности работы и обучения
За последние годы в образовании произошла большая революция, и сегодня почти все учебные заведения делают упор на эксклюзивное управление учебным...
0
0
25
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

Другие вопросы по теме