在CodeIgniter中检索单行作为EAV模型的查询结果

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

我已经使用MySQL(phpmyadmin)为使用CodeIgniter Framework(PHP)开发的电子商务网站实现了EAV模型。EAV模型就是这样:

产品

id | name   | description
-------------------------
1  | prod_1 | lorem
2  | prod_2 | ipsum

属性

id | name   | description
-------------------------
1  | attr_1 | dolor
2  | attr_2 | sit
3  | attr_3 | amet

产品属性

id | prod_id | attr_id
-------------------------
1  | 1       | 1
2  | 1       | 2
3  | 2       | 1
4  | 2       | 2
5  | 2       | 3

我使用多个联接生成了一个结果,如下所示:

product_name | attribute_name | product_description
---------------------------------------------------
prod_1       | attr_1         | lorem
prod_1       | attr_2         | lorem
prod_2       | attr_1         | ipsum
prod_2       | attr_2         | ipsum
prod_2       | attr_3         | ipsum

用于以上结果的查询如下:

function getProductList() {
  return $this->db->select('p.name as product_name, a.name as attribute_name, p.description as product_description')
                  ->from('products as p')
                  ->join('product_attributes as pa', 'pa.prod_id = p.id', 'LEFT')
                  ->join('attributes as a', 'a.id = pa.attr_id', 'LEFT')
                  ->get();
}

但是,查询后的结果如下:

product_name | attribute_name           | product_description
---------------------------------------------------
prod_1       | (attr_1, attr_2)         | lorem
prod_2       | (attr_1, attr_2, attr_3) | ipsum

当前查询结果的缺点是,我必须对结果执行嵌套循环才能显示产品及其属性的列表,这会影响性能。我愿意提出任何改善查询或其结果性能的建议。

php mysql codeigniter entity-attribute-value
3个回答
0
投票

您可以使用MySQL函数GROUP_CONCAT获得所需的结果:

http://sqlfiddle.com/#!9/c51040/3


0
投票

您将需要做此事

function getProductList() {
  return $this->db->select('p.name as product_name
                     , GROUP_CONCAT(a.name SEPARATOR ",") as attribute_name
                     , min(p.description) as product_description')
                  ->from('products as p')
                  ->join('product_attributes as pa', 'pa.prod_id = p.id', 'LEFT')
                  ->join('attributes as a', 'a.id = pa.attr_id', 'LEFT')
                  ->group_by("p.name");
                  ->get();
}

0
投票

如果要达到期望值,则必须使用GROUP BY。对于CodeIgniter,您可以在这里找到它,在此部分GROUP BY中找到它Guide page

$this->db->group_by()

如您在此处看到的,function getProductList() { return $this->db->select('p.name as product_name, concat(\'( \', GROUP_CONCAT(a.name), \' )\') as attribute_name, p.description as product_description') ->from('products as p') ->join('product_attributes as pa', 'pa.prod_id = p.id', 'LEFT') ->join('attributes as a', 'a.id = pa.attr_id', 'LEFT') ->group_by(array('p.name', 'p.description')) ->get(); } 我要打印的列名,grouping by您要检索的列名。希望这会有所帮助,祝你好运。

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