如何在发送到视图之前检查集合的关系数据

How to check relation data of a collection before sending it to view

我有一个这样的控制器方法:

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 table 记录的集合,其中 producer_process of 4 以及 brand_rejected相关brandstable记录的字段必须设置为0,我添加了一个array_push并检查了条件。

现在这工作正常并正确显示了正确的数据,但我想知道,shorthand 使用 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 根据关系的存在来限制结果集。这里我们说我们只想要字段 'produce_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 - Relationships - Querying Relationship Existence whereHas

Laravel 5.8 Docs - Eloquent - Relationships - Eager Loading with