可容纳的深度关联数据

Containable and deep associated data

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));
}

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

public $actsAs = array('Containable');

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

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

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

我明白了。我的所有模型都在一个 Api 插件中。我需要像这样在我的模型中创建我的 DocumentItemDescription 关联:

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

无论出于何种原因,我认为如果我的文档模型在我的插件中,它会找到其余部分,但事实并非如此。