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));
}
答案 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'
)
);
无论出于何种原因,我认为如果我的文档模型在我的插件中,它会发现其余的情况并非如此。