我有一张包含类似数据的项目表,如:
ItemDetails
id name value item_id
1 Toy 10300 1
2 Toy2 10103 1
3 Title One 1
4 Toy 300 2
5 Price 103 2
6 Exp 2020 2
我想使用一个使用CakePHP 2.x的find方法来读取所有数据,并按照item_id值对数组中的所有项进行分组。这是一个数组,每个元素都包含具有相同item_id的所有值的数组。所以数组看起来像:
Array
(
[0] => Array
(
[0] => Array
(
[ItemDetail] => Array
(
[id] => 1
[name] => Toy
[value] => 10300
[item_id] => 1
)
)
[1] => Array
(
[ItemDetail] => Array
(
[id] => 2
[name] => Toy1
[value] => 103003
[item_id] => 1
)
)
[2] => Array
(
[ItemDetail] => Array
(
[id] => 3
[name] => Title
[value] => One
[item_id] => 1
)
)
)
[1] => Array
(
[0] => Array
(
[ItemDetail] => Array
(
[id] => 4
[name] => Toy
[value] => 300
[item_id] => 2
)
)
[1] => Array
(
[ItemDetail] => Array
(
[id] => 5
[name] => Price
[value] => 300
[item_id] => 2
)
)
[2] => Array
(
[ItemDetail] => Array
(
[id] => 6
[name] => Exp
[value] => 2020
[item_id] => 2
)
)
)
)
我已经尝试了一些分组的想法,但它似乎消除了除了在表中找到的第一个字段值之外的所有字段值。我真的不想聚合数据,而是将类似item_id的所有内容组合在一起。
有人能指出我正确的方向吗?我想用一个find语句来做这个,所以我可以使用paginate。我已经设法用条件=> id =(预期的item_id列表)重复查找并从每次调用的结果构建数组。但似乎应该有更好的方法。
答案 0 :(得分:0)
Sql聚合和分组将无法真正帮助您在此处执行所需操作。你需要做的是:
在查询中按item_id订购sql结果集。
类似的东西:
select id,
name,
value,
item_id
from ItemDetails
order by item_id
逐步执行结果集,跟踪临时变量中的上一个item_id。当前行的item_id与前一行不匹配时,就可以开始外部数组的新元素了。
所以,比如:
$temp_item_id = -1;
$i = -1;
$result = array();
foreach($statement->fetchRow() as $row) {
if ($row['item_id'] !== $temp_item_id) {
++$i;
$result[$i] = array();
}
$temp_item_id = $row['item_id'];
$result[$i][] = array('ItemDetail' => $row);
}