如何在Laravel中将两列组合作为单个查询编写条件查询?

时间:2017-06-19 08:52:24

标签: sql laravel laravel-5

我有三个表productsproduct_meta_keysproduct_meta_values。产品表存储产品的一般信息,如nameproduct_meta_keys存储产品的动态功能/规范键,如product brand,而product_meta_values表存储给定产品和给定meta_key的相应值。以下是示例表结构:

产品表

enter image description here

产品Meta Key表

enter image description here

产品元值表

enter image description here

在此表中,product_idmeta_key_id是来自productproduct_meta_key表的外键。

现在,我想要的是,查询product_meta_values表以使用条件查询找到产品ID,并将两列(meta_key_idmeta_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();

enter image description here

我期待的是

+ --------- + |产品| + --------- + | 1 | + --------- +

但得到了空集。有什么想法吗?

先谢谢。

2 个答案:

答案 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。请注意,在查询任何字段之前,应该添加表的名称,因为您需要告诉查询在哪个表中查找字段。