我是一个使用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
查询构建器有其局限性。这就是为什么查询方法存在的原因。如果你有一个复杂的查询,我会建议你只使用 $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();
Codeigniter的BaseBuilder类希望第一个连接参数是表名。所以可以尝试传递表名,然后在表名本身上进行连接。我个人没有使用过表的别名,所以也可能是错误的。
以下是JOIN查询所期望的参数。
public function join(string $table, string $cond, string $type = '', bool $escape = null)
这里,它期望第一个名字是一个表,所以直接把表名的别名换成表名试试。
对于你的第二部分查询,如果你能把整个错误显示出来,而不是只贴出错误的第一条会更好。
最后还是设法解决了。
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();
}
谢谢你的指点!