可包含且深入的关联数据

时间:2015-04-04 04:21:20

标签: cakephp cakephp-2.0

document has many document_item
document_item has many document_item_description and belongs to document
document_item_description has one document_item

我正在尝试获取包含所有document_items的文档以及关联的document_items的所有关联document_item_descriptions

有办法做到这一点吗?现在我所能得到的只是document_items,但不能达到第三级。

        class Document extends AppModel {
        public $hasMany = array(
            'Document_item' => array(
                'className' => 'document_item',
                'foreignKey' => 'document_id'
                )
            );



    class DocumentItem extends AppModel {
        public $belongsTo = array(
            'document' => array(
                'className' => 'document',
                'foreignKey' => 'document_id'
                ));

        public $hasMany = array(
            'document_item_description' => array(
                'className' => 'document_item_description',
                'foreignKey' => 'document_item_id'
                ));
    }

    class DocumentItemDescription extends AppModel {
        public $hasOne = array(
            'document_item' => array(
                'className' => 'document_item',
                'foreignKey' => 'document_item_id'

                ));
    }

在我的控制器中我正在使用:

 public function index(){
    $res = $this->Document->find('all', array('recursive' => 3));
}

2 个答案:

答案 0 :(得分:0)

您的问题标题几乎可以回答您自己的问题。您应该使用Containable behavior而不是recursive选项。 recursive选项已从新的CakePHP 3中删除,因为它的开销很大,我建议你尽可能避免使用它。为了获得“深层”数据,首先将其添加到您的模型文件中(或者更好的是,您的AppModel,以便您可以随时使用它):

public $actsAs = array('Containable');

这将启用模型的可包含行为。然后,您可以使用查找中的contain键将表连接在一起,如下所示:

$this->Document->find('all', array(
    'contain' => array(
        'DocumentItem' => array(
            'DocumentItemDescription'
        )
    )
));

这将为您提供包含相关数据的数据数组。您还可以通过在任何阵列中指定fields选项来过滤每个模型所需的字段。

答案 1 :(得分:0)

我明白了。我在Api插件中拥有所有模型。我需要在我的模型中创建我的DocumentItemDescription关联:

    public $hasMany = array(
    'DocumentItem' => array(
        'className' => 'Api.DocumentItem',
        'foreignKey' => 'document_id'
    )
    );

无论出于何种原因,我认为如果我的文档模型在我的插件中,它会发现其余的情况并非如此。