1

我有一张包含许多具有类似数据的项目的表格,例如:

项目详情

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 语句来做到这一点,这样我就可以使用分页。我已经设法通过条件=> id =(预期的 item_id 列表)的重复查找来做到这一点,并根据每次调用的结果构建数组。但似乎应该有更好的方法。

4

1 回答 1

0

Sql 聚合和 group by 并不能真正帮助你在这里做你想做的事情。您需要做的是以下方面的事情:

在查询中按 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);
}
于 2013-09-19T02:10:46.233 回答