CakePHP 模型关联深层模型包含
Posted
技术标签:
【中文标题】CakePHP 模型关联深层模型包含【英文标题】:CakePHP model association deep model contain 【发布时间】:2013-08-22 17:58:08 【问题描述】:我已经为这个问题苦苦挣扎了一段时间,并且已经在我的 Cakephp 应用程序中匹配了与各种其他模型的关联,但仍然无法让结果数组包含关联的 ExpenseType。
一切从属性开始,其定义为:
var $recursive = 2;
var $actsAs = array('Containable');
模型关联
房产有很多账单
Bill belongsTo 属性
Bill hasOne ExpenseType
ExpenseType 属于 Bill
在我的 PropetiesController 中,我调用并分配给 $property:
$this->属性->findById($id);
这会导致:
Array
(
[Property] => Array
(
[id] => 2
[address] => **
[bedrooms] => 2
[bathrooms] => 1.5
[square_footage] => 973
[zip_code] => **
[created] => 2013-08-13 18:30:34
[modified] => 2013-08-15 19:08:32
)
[Bill] => Array
(
[0] => Array
(
[id] => 2
[expense_type_id] => 1
[property_id] => 2
[frequency] => monthly
[start_date] => 2013-09-16
[payee] => **
[amount] => **
[created] => 2013-08-20 19:57:41
[modified] => 2013-08-20 20:57:02
)
[1] => Array
(
[id] => 4
[expense_type_id] => 4
[property_id] => 2
[frequency] => monthly
[start_date] => 2013-09-15
[payee] => **
[amount] => 195
[created] => 2013-08-20 20:38:11
[modified] => 2013-08-20 20:38:11
)
)
)
对于我的生活,我无法获得包含 Bill 下 ExpenseType 详细信息的数组。请提出建议!
更新:在模型上设置包含方法时,Cake 现在报告:
模型“Bill”与模型“ExpenseType”没有关联
比尔模型
class Bill extends AppModel
/*******************
* Variables *
*******************/
var $actsAs = array('Containable');
/*********************
* Model Associations *
**********************/
public $belongsTo = array('Property');
public $hasOne = array('ExpenseType');
费用类型模型
class ExpenseType extends AppModel
/*******************
* Variables *
*******************/
var $actsAs = array('Containable');
/*******************
* Model Associations *
*******************/
public $belongsTo = array('Bill');
表结构
账单 身份证 expense_type_id property_id ... expense_types 身份证 姓名 说明【问题讨论】:
请发布 Bill 和 ExpenseType 的完整型号代码。 可能是因为你没有指定外键。这两张表的表结构是什么? 为相关表添加了表结构。 另外,请在标签中指定您使用的蛋糕版本。 【参考方案1】:通过进行以下更改,我能够使其正常工作:
属性模型
改变:
public $hasMany = array(
'Bill' => array(
'className' => 'bills',
'foreign_key' => 'property_id',
'dependent' => true
)
);
收件人:
public $hasMany = array('Bill');
比尔模型
public $belongsTo = array('Property', 'ExpenseType');
费用类型模型
public $hasMany = array('Bill');
似乎 Property 模型中的无效关联仍然允许查询 Bills,但不知何故弄乱了更深层次的关联。不知道为什么它会起作用。
【讨论】:
哦,因为'className' => 'bills'
应该是 'className' => 'Bill'
。这样就行了!好样的。
没错,甚至不知道如何查询账单。我预计此时会出现错误。【参考方案2】:
一些建议:
1.) 在 findById
之前将递归移动到 PropertiesController
$this-Property->recursive = 2;
2.) 在 Bill 和 ExpenseType 模型上使用可包含的行为
var $actsAs = array('Containable');
...然后在 PropertiesController 中执行...
$this->Property->contain(array(
'Bill' => array(
'ExpenseType'
)
));
$this->set('property', $this->Property->findById($id));
更新 #1:
比尔模型
class Bill extends AppModel
/*******************
* Variables *
*******************/
var $actsAs = array('Containable');
/*********************
* Model Associations *
**********************/
public $belongsTo = array(
'Property' => array(
'className' => 'Property',
'foreignKey' => 'property_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'ExpenseType' => array(
'className' => 'ExpenseType',
'foreignKey' => 'expense_type_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
); // end belongsTo
// end Bill model
费用类型模型
class ExpenseType extends AppModel
/*******************
* Variables *
*******************/
var $actsAs = array('Containable');
/*******************
* Model Associations *
*******************/
public $hasMany = array(
'Bill' => array(
'className' => 'Bill',
'foreignKey' => 'expense_type_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
); // end hasMany
// end ExpenseType model
然后清除缓存
【讨论】:
请看我的更新。说 Bill 与 ExpenseType 没有关联 没有变化,还是说没有关联。看看这是多么令人沮丧:) 嗯,我一直在深藏。有时比这更多的层。我记得当我开始时经常遇到这个问题,但我试图回忆解决方案是什么。有时它与命名约定有关,但您的似乎是正确的。 我已经弄清楚了,请参阅下面的答案。非常感谢您的帮助。以上是关于CakePHP 模型关联深层模型包含的主要内容,如果未能解决你的问题,请参考以下文章