我在名为Book的模型上调用find,该模型与模型Page(book_id)
相关联但是,Page与名为Asset(page_id)的模型相关联。我想得到所有三个模型的阵列
Book
Page1
Asset1
Asset2
Asset3
Page2
Asset1
Asset2
Asset3
我目前的代码只能让我获得Book and Page
$options = array(
'conditions' => array('Book.' . $this->Book->primaryKey => $id),
'contain' => 'Page'
);
$books = $this->Book->find('first', $options);
预订hasMany Pages 页面包含多个资产
答案 0 :(得分:3)
您可以包含更深层次的关联,就像在docs
中所说的那样来自文档的示例
$this->User->find('all', array(
'contain' => array(
'Profile',
'Account' => array(
'AccountSummary'
),
'Post' => array(
'PostAttachment' => array(
'fields' => array('id', 'name'),
'PostAttachmentHistory' => array(
'HistoryNotes' => array(
'fields' => array('id', 'note')
)
)
),
'Tag' => array(
'conditions' => array('Tag.name LIKE' => '%happy%')
)
)
)
));
你的模特也一样......
$options = array(
'conditions' => array('Book.' . $this->Book->primaryKey => $id),
'contain' => array('Page' => array('Asset')))
);
$books = $this->Book->find('first', $options);
如果正确设置了关联(并且所有模型都实现了可包含的行为),则应该有效。
修改强>
(解决OP的困惑)
嵌套的包含选项适用于扩展数组的模型。例如,如果模型像这样关联
Model-A -> Model-B -> Model-C & Model-D
-> Model-E -> Model-C
您可以使用
等数据获取整个数组Model-A
Model-B1
Model-C1
Model-C2
Model-D2
Model-B2
Model-C (null)
Model-D3
Model-E1
Model-C1
Model-C3
使用
之类的东西$this->ModelA->find('all'), array(
'contain' => array(
'Model-B' => array('Model-C', 'Model-D'),
'Model-E' => array('Model-C')
)
);
此外,您可以add options到可包含的数组,包括用于搜索的数组,例如'conditions'
(虽然要小心这一点,但这意味着如果模型与条件不符合它将返回一个空数组,它不意味着整个“Model-A”将不在返回的数据中,因为其中一个嵌套条件未得到满足。)