cakephp找到相关模型的相关模型

时间:2014-07-21 20:47:24

标签: cakephp cakephp-2.5

我在名为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 页面包含多个资产

1 个答案:

答案 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”将不在返回的数据中,因为其中一个嵌套条件未得到满足。)