如何从集合laravel上的每个子循环返回true到父过滤器循环


$products = $category - > products;
foreach($params as $key => $item) {
if ($key === 'attribute') {
$attributes = $item;
// dd($attributes);
foreach($attributes as $subkey => $value) {
// dd($subkey, $value);
$attr_ids = ProductAttribute::where('name', $subkey) - > pluck('id') - > toArray();
// print_r($attr_ids);
// dd($attr_ids);
foreach($attr_ids as $attr_id) {
$filtered_products = new Collection();
$filtered_products = $products - > filter(function($item) use($attr_id, $value)
{
// echo $attr_id;
$item - > characteristics - > each(function($charac) use($value)
{
// print_r($charac->value);
// dd($value);
return in_array($charac - > value, $value);
});
});
$products = $filtered_products;
}
}
}
}

我正在开发一个过滤器。按类别检索产品后我正在循环浏览params url(即http://127.0.0.1:8000/dariy?attribute[size][0]=xs&attribute[rang][0]=black&property[color][0]=green&property[color][1]=tomato(

在DB中,我得到了一个产品表、productCharacteristics和productAttributes。

我正在按params(键(中给定的名称检索属性的id。

productCharacteristics正在按关系检索。

当我浏览产品的特性时,我会根据params中的值来检查每个特性的值。

如果正确的话,我应该返回true来过滤。但这就是我被卡住的地方。在过滤器的内部有每个,这就是为什么我不能直接返回过滤器。我该怎么做?

我是

foreach ($params as $key => $item) {

if ($key === 'attribute' && !empty($item)) {
$filtered_products = new Collection();
$attributes = $item;
// dd($attributes);
foreach ($attributes as $subkey => $value) {
// dd($subkey, $value);
$attr_ids = ProductAttribute::where('name', $subkey)->pluck('id')->toArray();
// print_r($attr_ids);
// dd($attr_ids);
$attr_status = false; // assume there's no match
foreach ($attr_ids as $attr_id) {
$filtered_products = $products->filter(function ($item) use ($attr_id, $value, &$attr_status)
{
// assume product can't pass filter
$item->status = false;
$item->characteristics->each(function ($charac) use (&$item, $value, $attr_id)
{
// product characteristic's attribute_id and charac value  match set to tru to return to filtered prducts
if($attr_id == $charac->attribute_id && in_array($charac->value, $value)){
$item->status = true;  // now product can pass.
return true;
}
});                                                
if ($item->status === true) {
$attr_status = true;
return true;
}else{
return false;
}                      
});
// setting there's a match for this filter.
if ($attr_status) {
continue 2; // skipping to next filter
}

}
}
$products = $filtered_products;
}
}
  1. 在每个闭包的第一级中,我设置了一个变量$attr_status = false,这样每个过滤器都会继续。2.在检查的每个产品属性中,值和属性id是否匹配如果是,$product进入过滤器,并且我设置$attr_status = true;因此可以跳过过滤周期

最新更新