获取每个类别中Item.name = bla的所有项目:如何?

时间:2012-02-10 04:32:23

标签: cakephp

想象一下,我有两个模型:项目和类别。类别hasMany Items和Item belongsTo Category。

我想获得一个关于cakephp通常如何返回它的数组“逆转”:通常我会得到类似的东西

[Item]
    ...some props...
    [Category]
        ...some props...

虽然我想要这样的东西:

Array
    [0][Category]
        Array
            [0][Item]
               ...some props...
            [1][Item]
    [1][Category]

......等等

如果可能,如何使用查找方法获取此结果?否则,如何获得它?

我当前的模型要复杂得多,但我想我可以将这个teory应用到我的所有模型中(我有一个Category => Group => Item关系)。

感谢您的建议和解答。

1 个答案:

答案 0 :(得分:1)

根据你问题的标题,如果要点只是获取链接到名为'bla'的类别的项目,你可以只调用Category模型而不是Item模型的find()方法。

而不是

$this->Item->find('all', array('conditions' => array('Category.name' => 'bla')));

DO

$this->Item->Category->find('all', array('conditions' => array('Category.name' => 'bla')));

这样它将首先过滤相应的类别,然后获取链接的项目。所以你会得到像

这样的东西
Array
(
  [0] => Array
    (
      [Category] => Array
        (
          [id] => 1
          [name] => bla
          ...
        )
      [Item] => Array
        (
          [0] => Array
            (
              [id] => 1
              ...
            )
          [1] => Array
            (
              [id] => 2
              ...
            )
        )
    )
)

修改

将三个模型链接在一起,它有点复杂。我能想到的唯一可以防止加载大量数据的解决方案是使用INNER JOIN构建查询:

$categories = $this->Category->find('all', array('fields' => array('Category.id', 'Category.name', 'Item.id', 'Item.name'),
'joins' => array(
    array(  'table' => 'groups',
            'alias' => 'Group',
            'type' => 'inner',
            'conditions' => 'Group.category_id = Category.id'
        ),
    array(  'table' => 'items',
            'alias' => 'Item',
            'type' => 'inner',
            'conditions' => array('Item.group_id = Group.id', 'Item.name' => 'bla')
        ))));

它会返回一个这样的数组:

Array
(
  [0] => Array
  (
    [Category] => Array
    (
      [id] => 2
      [name] => Shop
    )
    [Item] => Array
    (
      [id] => 1
      [name] => Bla
    )
  )
)

<强> EDIT2

关于你将获得的数组结构的最后一句话:它不完全像你想要的那样。 Item数组与Category数组处于同一级别。因此,您最终可能会在同一类别中使用多对类别项目。

但是一个简单的foreach循环将允许您使用您希望的精确结构构建一个数组,并且此查询的优势在于只能从数据库中获取所需内容。