这是我的表变化
+---------------+---------+------------+-----------+--------+---------+----------+
| 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
中选择*,其中{?,?)中的option
和value
中的$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” ]
答案 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.
如果只想返回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 /"