卡在laravel查询中

时间:2018-09-21 08:15:41

标签: php laravel eloquent

我正在尝试使用laravel编写一个过滤器系统,情况如下:

这是我的$inputs数组。颜色是复选框,材料是下拉列表:

$inputs = [
    'colors' => ['green' => 'green', 'red' => 'red'],
    'material' => 'wood',
]

这是我正在查看的表(variants_values)。这是我存储变体的所有属性组合的地方:

id  | product_id | variant_id | property_id |   label   | value
550           91          213             1    color      green
551           91          213             2    material   wood
552           91          214             1    color      red
552           91          214             2    material   plastic

这是我的要求。目标是返回相应的产品,因此我使用whereHas()方法对我的variants_values进行子查询:

    foreach($inputs as $key => $input) {
        $products->whereHas('variants_values', function($query) use($key, $input) {
            if(is_array($input)) {
                $query->where('label', $key)->whereIn('value', $input);
            } elseif(!empty($input)) {
                $query->where('label', $key)->where('value', $input);
            }

        });
    }

除了以下一种情况外,此代码效果很好:

  • 如果我检查green的颜色和wood的材料,我希望退回我的产品91

但是

  • 如果我检查red的颜色和wood的材料,则我不会有任何结果,因为red的变体是plastic而非wood制成的。
  • li>

实际上,产品91仍会返回,因为实际上,我的代码不会检查它是否与$inputs相同;

所以我需要在代码中写一些内容:

foreach($inputs as $key => $input) {
    $products->whereHas('variants_values', function($query) use($key, $input) {
        if(is_array($input)) {
            $query->where('label', $key)->whereIn('value', $input);
        } elseif(!empty($input)) {
            $query->where('label', $key)->where('value', $input);
        }
        ##
        $query->where('Verify that the variant ID is the same or something like that');
        ##
    });
}

我知道我离解决方案不远,但实际上我被困在这里。

谢谢您的帮助

1 个答案:

答案 0 :(得分:0)

看来这需要更复杂的查询。

将其放入您的Product模型中:

public function variants() {
    return $this->belongsToMany(Variant::class, 'variants_values');
}

variants_values关系复制到您的Variant模型中。

然后尝试:

$products->whereHas('variants', function($query) use($inputs) {
    foreach($inputs as $key => $input) {
        $query->whereHas('variants_values', function($query) use($key, $input) {
            $query->whereColumn('product_id', 'products.id');
            if(is_array($input)) {
                $query->where('label', $key)->whereIn('value', $input);
            } elseif(!empty($input)) {
                $query->where('label', $key)->where('value', $input);
            }
        });
    }
});