根据问题的标题,如果问题的关键只是获取链接到名为'bla'的类别的项目,则可以在类别模型而不是项目模型上调用find()方法。
而不是
$this->Item->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
...
)
)
)
)
编辑
随着连接在一起三款车型,它更复杂一些。我能想到的唯一的解决办法,以防止装载大量的数据是建立查询与内部联接:
$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数组与Array数组处于相同的级别。所以你可能会得到许多对同一类别的Category-Item对。
但是,一个简单的foreach循环可以让你用你想要的确切结构来构建一个数组,并且这个查询的优点是只需要从数据库中获得必要的东西。
我写错了,对不起。我正在寻找Item.name,而不是Category.name。 – 2012-02-10 14:34:03
我的错误也是,因为在再次读到你的问题之后,我意识到有一个Group模型介于你没有提到Array的例子中,这对于答案可能很重要。所以基本上,你有包含包含项目的组的类别,并且你想要得到的是包含包含名为'bla'的项目的组的类别? – nIcO 2012-02-10 14:56:07
正是我想要的。我没有提到Group,因为我认为我可以使查询适用于Group-> Item,然后使其适用于Category-> Groups,如果它不是我会更新问题的话! – 2012-02-10 15:44:51