我有三个表products
,product_meta_keys
和product_meta_values
。产品表存储产品的一般信息,如name
和product_meta_keys
存储产品的动态功能/规范键,如product brand
,而product_meta_values
表存储给定产品和给定meta_key的相应值。以下是示例表结构:
产品表
产品Meta Key表
产品元值表
在此表中,product_id
和meta_key_id
是来自product
和product_meta_key
表的外键。
现在,我想要的是,查询product_meta_values
表以使用条件查询找到产品ID,并将两列(meta_key_id
和meta_value
)组合为一个条件。
这是我尝试过的查询(暂时忽略连接部分):
\DB::table('product_meta_values')
->select('product_id as product')
->where(function($query){
$query->where('meta_key_id', 1)
->where('meta_value', 'MValue 1');
})
->where(function($query){
$query->where('meta_key_id', 2)
->where('meta_value', 'MValue 2');
})
->distinct()
->get();
我期待的是
+ --------- + |产品| + --------- + | 1 | + --------- +
但得到了空集。有什么想法吗?
先谢谢。
答案 0 :(得分:2)
SELECT
x1.product_id
FROM
(
SELECT
product_id
from
meta_values
where
(
meta_key_id = 1
AND meta_value = 'MValue1'
)
) as x1 ,
(
SELECT
product_id
from
meta_values
where
(
meta_key_id = 2
AND meta_value = 'MValue2'
)
) as x2
where
x1.product_id = x2.product_id
您的查询的问题是在单行上使用多个列的 AND ,AND的作用是在一行中严格搜索匹配结果。这有点棘手。尝试使用子查询来解决这些问题。
答案 1 :(得分:0)
您应该使用连接来解决这些问题:
Product::
join('pmv', 'pmv.product_id', '=', $product->id)->
join('mk', 'pmv.meta_value', '=', 'mk.id')->
where( //add conditions here// )->where('key', '=', 'value')->
select('products.name', 'pmv.field1', 'mk.fieldX')->
get();
其中pmv是product_meta_values,mk是meta_keys。请注意,在查询任何字段之前,应该添加表的名称,因为您需要告诉查询在哪个表中查找字段。