将包含 LEFT JOINed 子查询的 SELECT 查询转换为 CodeIgniter 活动记录脚本

问题描述 投票:0回答:3

我有如下sql查询,我想将原始SQL转换为CodeIgniter查询构建方法。

SELECT *
FROM color c 
LEFT JOIN (
    SELECT pc.*
    FROM product_color pc
    LEFT JOIN product p ON pc.product_id = p.product_id
    WHERE p.product_id = 1
) x ON c.id = x.color_id
php codeigniter activerecord subquery query-builder
3个回答
1
投票

在 codeigniter 中,您可以使用 get_compiled_select 函数获取已编译的查询。

我们首先创建内部查询。

     $inner_query = $this->db->select('pc.*')
     ->from('product_color pc')
     ->join('product p','pc.product_id = p.product_id','left')
     ->where('p.product_id',1)
     ->get_compiled_select();

现在我们将使用内部查询来创建最终查询。

 $final_query = $this->db->select('*')
 ->from('color c')
 ->join("($inner_query) x",'c.id=x.color_id','left')
  ->get_compiled_select();
echo $final_query; die;

1
投票

在模型文件中尝试此操作。并且 sql 关键字最好保持大写。

    $query = "SELECT * FROM color c 
        LEFT JOIN (SELECT pc.* FROM product_color pc
        LEFT JOIN product p ON pc.product_id=p.product_id
        WHERE p.product_id=1)x on c.id=x.color_id"

    $query = $this->db->query($query);
    $data =  $query->result_array();

0
投票

您想要的查询不需要 LEFT JOINed 子查询; SQL 可以简化为仅两个 LEFT JOIN。

SELECT c.*
FROM color c
LEFT JOIN product_color pc ON c.id = pc.color_id
LEFT JOIN product p ON pc.product_id = p.product_id
WHERE p.product_id = 1;

或更简洁地使用

USING
:

SELECT c.*
FROM color c
LEFT JOIN product_color pc ON c.id = pc.color_id
LEFT JOIN product p USING (product_id)
WHERE p.product_id = 1;

链式查询构建器脚本可以通过以下方式实现:

return $this->db
    ->select('c.*')
    ->join('product_color pc', 'c.id = pc.color_id', 'LEFT')
    ->join('product p', 'product_id', 'LEFT')
    ->get_where('color c', ['p.product_id' => 1])
    ->result();

上面的脚本将生成一个 SQL 查询,其中所有表和列名都被正确引用,并将返回一个包含零个或多个对象的数组。

© www.soinside.com 2019 - 2024. All rights reserved.