Codeigniter的模型与QueryBuilder JOIN查询。

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

我是一个使用CI4模型的新手,正在努力调整我现有的MySQL JOIN查询,以便与用户指南中的示例一起工作。

我已经调整了我的部分代码,就像这样。

    public function brand_name($brand_name_slug)
    {
        return $this->asArray()
                    ->where('availability', 'in stock')
                    ->where('sku !=', '')
                    ->where('brand_name_slug', $brand_name_slug)
                    ->groupBy('gtin')
                    ->orderBy('brand_name, subbrand_name, product, size, unit')
                    ->findAll();
    }

它工作得很好 我看了一下示例,发现我可以添加以下代码。->table('shop a') 并且仍然有效,但我还需要添加下面的JOIN语句。

JOIN (SELECT gtin, MIN(sale_price) AS sale_price FROM shop GROUP BY gtin) AS b ON a.gtin = b.gtin AND a.sale_price = b.sale_price

只要我加上 ->join('shop b', 'a.gtin = b.gtin and a.sale_price = b.sale_price') 我得到一个'404 - File Not Found'错误。

当我查看所有CI4连接的例子并调整我的代码以适应时,我的 foreach($shop as $row) 循环会产生 "Whoops... "错误,因为它们的结尾是一个 getResult()getResultArray - 而不是 findAll().

哪种方式是前进的方向,我需要改变我的。foreach 循环。

完整的MySQL语句。

SELECT * FROM shop a JOIN (SELECT gtin, MIN(sale_price) AS sale_price FROM shop GROUP BY gtin) AS b ON a.gtin = b.gtin AND a.sale_price = b.sale_price WHERE availability = 'in stock' AND sku != '' AND brand_name_slug = $brand_name_slug GROUP BY gtin ORDER BY brand_name, subbrand_name, product, size
mysql codeigniter join query-builder codeigniter-4
1个回答
0
投票

查询构建器有其局限性。这就是为什么查询方法存在的原因。如果你有一个复杂的查询,我会建议你只使用 $this->query();. 这将使你失去更少的时间和精力转换的东西,你知道已经工作。最重要的是,在转换复杂的查询时,你通常会使用查询生成器,但其中有很大一部分是你的SQL。

在你的模型中扩展 CodeIgniter\Model :

    $query = $this->db->query("SELECT * FROM shop a JOIN (SELECT gtin, MIN(sale_price) AS sale_price FROM shop GROUP BY gtin) AS b ON a.gtin = b.gtin AND a.sale_price = b.sale_price WHERE availability = 'in stock' AND sku != '' AND brand_name_slug = \$brand_name_slug GROUP BY gtin ORDER BY brand_name, subbrand_name, product, size");

    // your array result
    $result_array = $query->getResultArray();
    // your object result
    $result_object = $query->getResult();

0
投票

Codeigniter的BaseBuilder类希望第一个连接参数是表名。所以可以尝试传递表名,然后在表名本身上进行连接。我个人没有使用过表的别名,所以也可能是错误的。

以下是JOIN查询所期望的参数。

    public function join(string $table, string $cond, string $type = '', bool $escape = null)

这里,它期望第一个名字是一个表,所以直接把表名的别名换成表名试试。

对于你的第二部分查询,如果你能把整个错误显示出来,而不是只贴出错误的第一条会更好。


0
投票

最后还是设法解决了。

    public function brand_name($brand_name_slug)
    {
        return $this
                    ->db
                    ->table('shop a')
                    ->select()
                    ->join('(SELECT sku, MIN(sale_price) AS sale_price FROM shop GROUP BY sku) AS b', 'a.sku = b.sku AND a.sale_price = b.sale_price')
                    ->where('availability', 'in stock')
                    ->where('a.sku !=', '')
                    ->where('brand_name_slug', $brand_name_slug)
                    ->groupBy('a.sku')
                    ->orderBy('brand_name, subbrand_name, product, size, unit')
                    ->get()
                    ->getResult();
    }

谢谢你的指点!

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