Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php laravel使用多个过滤器从表中过滤出产品_Php_Laravel - Fatal编程技术网

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(...)