【问题标题】:How to write conditional query with combination of two columns as a single query in Laravel?如何在 Laravel 中编写将两列组合为单个查询的条件查询?
【发布时间】:2017-11-21 09:42:30
【问题描述】:

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

产品表

产品元密钥表

产品元值表

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

现在,我想要的是,使用条件查询将两列(meta_key_idmeta_value)组合为单个条件,查询 product_meta_values 表以查找产品 ID。

这是我尝试过的查询(暂时忽略连接部分):

\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 | +---------+

但设置为空。有什么想法吗?

提前致谢。

【问题讨论】:

    标签: sql laravel laravel-5


    【解决方案1】:

    你应该使用连接来解决这些类型的问题:

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

    【讨论】:

    • 感谢您的回复,但您是否真的运行查询以获得上述给定条件的预期结果?
    • 不是这个查询。在连接中,您指定不同表中的哪些字段应该相同,然后您可以使用 where 为这些表上的所有内容添加条件。
    • 加入表不是我的实际问题,我的主要问题是在给定条件下从单个 (product_meta_values) 中查找值
    • 条件是什么,需要检索哪些字段?
    • 我想用两列(meta_key_idmeta_value)的组合编写条件查询。例如 [ meta_key_id => 1 and meta_value => 'MValue 1'] 作为一个条件, [ meta_key_id => 2 and meta_value => 'MValue 2'] 作为另一个条件,我想检索 product_ids 。
    【解决方案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 所做的是严格搜索单行中的匹配结果。这有点棘手。尝试对这类问题使用子查询。

    【讨论】:

      猜你喜欢
      • 2021-12-06
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多