可容纳的深度关联数据
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'
)
);
无论出于何种原因,我认为如果我的文档模型在我的插件中,它会找到其余部分,但事实并非如此。
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'
)
);
无论出于何种原因,我认为如果我的文档模型在我的插件中,它会找到其余部分,但事实并非如此。