laravel使用多个whereIn从表中过滤出产品

时间:2018-07-09 18:42:59

标签: php laravel

这是我的表变化

+---------------+---------+------------+-----------+--------+---------+----------+
|  product_id   | sku_id  | option_id  | value_id  |  sku   | option  |  value   |
+---------------+---------+------------+-----------+--------+---------+----------+
|           18  |     11  |         7  |        7  | wsu34  | size    | 7        |
|           18  |     11  |         8  |        8  | wsu34  | color   | #2A2947  |
|           18  |     12  |         7  |        9  | ws52   | size    | 5        |
|           18  |     12  |         8  |       10  | ws52   | color   | #64556d  |
|           18  |     13  |         7  |       11  | wsu34  | size    | 10       |
|           18  |     13  |         8  |       12  | wsu34  | color   | #64556d  |
+---------------+---------+------------+-----------+--------+---------+----------+

我想通过过滤“选项”和“值”列来选择产品

$opt = [size", "color"];
$val = ["5", "#2A2947"];

$kf = Variation::whereIn('option', $opt)
             ->whereIn('value',$val)->where('product_id', 18)
             ->pluck('sku');

sql查询为

  

”从variations中选择*,其中{?,?)中的optionvalue中的 $opt = [size", "color"]; $val = ["10", "#64556d"]; $kf = Variation::whereIn('option', $opt) ->whereIn('value',$val) ->where('product_id',$prodId) ->pluck('sku') ->toArray();   (?,?)”

期望的结果应该是 wsu34

但是我得到了错误的值。

修改

不同的查询

var express = require('express');
var router = express.Router();

//Get about
router.get('/about', function(req,res){
    res.render('about');
});

//Get services
router.get('/services', function(req,res){
    res.render('services');
});

//Get packages
router.get('/packages', function(req,res){
    res.render('/packages');
});

//Get incentives
router.get('/incentives', function(req,res){
    res.render('/incentives');
});

module.exports = router;

结果= [ “ ws52”, “ wsu34”, “ wsu34” ]

2 个答案:

答案 0 :(得分:1)

我测试您的代码。您的查询返回:

array:2 [▼
  0 => "wsu34"
  1 => "ws52"
]

因为第一行和第三行与您的查询匹配。

要查看查询,可以在查询中创建错误并在调试页面上查看查询。 例如,我用sku替换了‍ sku1

$opt = ['size', "color"];
$val = ["5", "#2A2947"];


$kf = Variation::whereIn('option', $opt)
    ->whereIn('value',$val)->where('product_id', 18)->pluck("sku1");
    dd($kf->toArray());

在调试页面上,您的查询将显示给您。

select `sku` from `variation` where `option` in (size, color) and `value` in (5, #2A2947) and `product_id` = 18.

enter image description here



更新

如果只想返回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);

答案 1 :(得分:1)

“期望的结果应该是wsu34”。

听起来您的查询不是您想要的,因为您试图根据所有条件仅选择一个sku,但是您的查询返回的是product_id_TO_opt_id或product_id_TO_value_id上​​的匹配项。

但是我认为您真正想要的是与product_id_TO_opt_id和product_id_TO_value_id匹配的。当前正在编写查询时,值和列都不必全部匹配它们必须在任一列和product_id中匹配的所有3个条件。

要解决此问题,您必须更改查询以检查 4个选项和价值标准之间的匹配的4个特定条件 –在原始SQL中是这样的

DB::select(...)

DB:raw(...)

SQL Fiddle - returns just "wsu34"

关于在Laravel 4/5中执行此操作,我建议尝试进行原始查询或数据库选择查询,或者仅将上述每个查询添加为新的-> where()条件。

$ curl -vLI telnet://www.google.com:80/ <<< "GET /"