簡體   English   中英

卡在laravel查詢中

[英]Stuck with laravel query

我正在嘗試使用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);
            }

        });
    }

該代碼在一種情況下工作得很好:

  • 如果我檢查greenwood材料,那么我希望退回我的產品91

  • 如果我檢查redwood材料,我不會有任何結果,因為red變體是plastic而不是wood

實際上,產品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');
        ##
    });
}

我知道我離解決方案不遠,但實際上我被困在這里。

謝謝您的幫助

看來這需要更復雜的查詢。

將其放入您的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);
            }
        });
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM