Php laravel使用多个过滤器从表中过滤出产品
这是我的桌子 我想通过过滤“选项”和“值”列来选择产品Php laravel使用多个过滤器从表中过滤出产品,php,laravel,Php,Laravel,这是我的桌子 我想通过过滤“选项”和“值”列来选择产品 $opt = [size", "color"]; $val = ["5", "#2A2947"]; $kf = Variation::whereIn('option', $opt) ->whereIn('value',$val)->where('product_id', 18) ->pluck('sku'); sql查询被删除 从?,?中的选项的变体中选择*?价值
$opt = [size", "color"];
$val = ["5", "#2A2947"];
$kf = Variation::whereIn('option', $opt)
->whereIn('value',$val)->where('product_id', 18)
->pluck('sku');
sql查询被删除
从?,?中的选项的变体中选择*?价值
预期的结果应该是wsu34 但是我得到了错误的值 编辑 与不同的查询
$opt = [size", "color"];
$val = ["10", "#64556d"];
$kf = Variation::whereIn('option', $opt)
->whereIn('value',$val)
->where('product_id',$prodId)
->pluck('sku')
->toArray();
结果=[
ws52,
wsu34,
wsu34
]我测试您的代码。您的查询返回:
array:2 [▼
0 => "wsu34"
1 => "ws52"
]
因为第一行和第三行匹配您的查询
要查看查询,您可以在查询中创建一个错误,并在调试页面上查看您的查询。
例如,我替换了带有sku1的sku:
在调试页面上,您的查询将显示
select `sku` from `variation` where `option` in (size, color) and `value` in (5, #2A2947) and `product_id` = 18.
使现代化
如果您只想返回wsu34。您可以使用以下查询:
SELECT
`sku1`
FROM
`variation`
WHERE
`product_id` = 18 AND `option` = 'color'
AND `value` IN ('#64556d')
AND `sku` IN (SELECT
`sku`
FROM
`variation`
WHERE
`option` = 'size' AND `value` IN (10))
这样:
$size=['10'];
$color=["#64556d"];
$kf = Variation::where('product_id',18)->where('option', 'color')->whereIn('value', $color)->whereIn('sku',function ($query) use ($size) {
$query->select('sku')
->from(with(new Variation)->getTable())
->where('option', 'size')->whereIn('value', $size);
})
->pluck('sku')
->toArray();
dd($kf);
预期结果应该是wsu34 听起来您的查询并不是您想要的,因为您试图根据所有条件仅选择一个sku,但您的查询返回的是product_id_to_opt_id或product_id_to_value_id的匹配项 但我认为您实际需要的是在product_id_TO_opt_id和product_id_TO_value_id上进行匹配。由于您的查询当前已编写,值和列不必匹配所有3个条件,它们只需在任一列和product_id中匹配即可 要解决此问题,您必须更改查询,以检查选项和值的4个条件之间的4个特定匹配条件,如原始SQL中所示:
SELECT
v.sku
FROM (
SELECT
product_id, sku_id, sku, opt, val
FROM variation
WHERE product_id = 18
) v
WHERE (v.val = "10" AND v.opt = "size") OR (v.val = "10" AND v.opt = "color")
OR (v.val = "#64556d" AND v.opt = "size") OR (v.val = "#64556d" AND v.opt = "size");
至于在Laravel4/5中这样做,我建议尝试一个raw或DB select查询,或者只是将上面的每一个添加为一个新的->where条件
DB::select(...)
DB:raw(...)
您的代码有sintax错误,缺少引号。这是真实的代码吗?根据您提供的代码,查询将返回两个不同的SKU,而不是一个。请查看我的编辑您想要的结果是什么?$opt=[size,color];value_id=10,11,12,正确吗?有问题吗?我测试了第二个查询,结果还可以。它返回数组:3[▼ 0=>ws52 1=>wsu34 2=>wsu34]。你的问题到底是什么?我希望它只返回'wsu34',因为它只有'color'是'64556d','size'是'10','ws52'都不匹配
SELECT
v.sku
FROM (
SELECT
product_id, sku_id, sku, opt, val
FROM variation
WHERE product_id = 18
) v
WHERE (v.val = "10" AND v.opt = "size") OR (v.val = "10" AND v.opt = "color")
OR (v.val = "#64556d" AND v.opt = "size") OR (v.val = "#64556d" AND v.opt = "size");
DB::select(...)
DB:raw(...)