想象一下,我有两个模型:项目和类别。类别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关系)。
感谢您的建议和解答。
答案 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循环将允许您使用您希望的精确结构构建一个数组,并且此查询的优势在于只能从数据库中获取所需内容。