【问题标题】:Filter data based on relation laravel基于关系 laravel 过滤数据
【发布时间】:2021-03-09 13:46:29
【问题描述】:

我有这样的产品表:

id | Title     | Price

1    Title 1     5000
2    Product 2   7000

这与product_attribute表有关

id | product_id | attribute_id | attribute_name | value
 1     1              5             Color         Red
 2     1              6             Size           XL
 3     2              5             Color         Green

在产品模型中有如下关系:

 public function attributes()
    {
        return $this->hasMany(ProductsAttribute::class, 'product_id ');
    }

在控制器方法中:

public function search(Request $request)
    {  
     $attributes=$request->attributes;
     foreach($attributes as $attr)
          {
            $attribute_id=$attr['attribute_id'];
            $attribute_value=$attr['value'];
          }

     return product::with('attributes')
            ->whereHas('attributes', function ($query) use ($attribute_id,$attribute_value)  {
                $query->where('attribute_id', $attribute_id);
                $query->where('value', $attribute_value);
            })->paginate(10);
    }

问题出在我的 foreach 循环中,我得到了多个属性 ID 和属性值,但在查询中我只能传递属性 ID 和值的单个值。我想获取属性 id 和属性值匹配的所有产品。非常感谢任何帮助。

【问题讨论】:

  • 平均 $attribute_id 和 $attribute_value 是数组
  • @Donkarnash:目前它是一个变量,但如果可以从我正在使用的单个查询中获取,我们可以将其设为数组

标签: laravel laravel-5


【解决方案1】:

你可以试试这样的:

public function search(Request $request)
    {
        $attributes = $request->all()['attributes'];
        $attributeIds = array_column($attributes, 'attribute_id');
        $attributeValues = array_column($attributes, 'value');

        return product::with('attributes')
            ->whereHas('attributes', function ($query) use ($attributeIds, $attributeValues) {
                $query->whereIn('attribute_id', $attributeIds)
                    ->whereIn('value', $attributeValues);
            })->paginate(10);
    }

【讨论】:

    【解决方案2】:

    如果 $attribute_id 和 $attribute_value 是数组

    public function search(Request $request)
    {
       /** Assuming that $request->attributes is like
        *
        * $request->attributes = [
        *  ['id' => 1, 'value' => 'Red'],
        *  ['id' => 2, 'value' => 'Xl'],
        *  ['id' => 3, 'value' => 'Green'],
        * ];
        *
        */
    
       
        $attributes = collect($request->attributes);
    
        $attribute_id = $attributes->map(function($item){return $item['id'];});
    
        $attribute_value = $attributes->map(function($item){return $item['value'];});
        
        return Product::with('attributes')
            ->whereHas('attributes', function ($query) use ($attribute_id,$attribute_value){
                $query->whereIn('attribute_id', $attribute_id);
                $query->whereIn('value', $attribute_value);
            })
            ->paginate(10);
    

    【讨论】:

    • 在这种情况下,$attribute_id 和 $attribute_value 是 foreach 的最后一个元素。
    猜你喜欢
    • 2021-08-07
    • 2021-08-30
    • 1970-01-01
    • 2013-09-14
    • 2019-07-24
    • 2021-12-20
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    相关资源
    最近更新 更多