如何在发送到视图之前检查集合的关系数据
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
相关brands
table记录的字段必须设置为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
我有一个这样的控制器方法:
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
相关brands
table记录的字段必须设置为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