[英]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);
}
});
}
該代碼在一種情況下工作得很好:
green
和wood
材料,那么我希望退回我的產品91
。 但
red
和wood
材料,我不會有任何結果,因為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.