CakePHP 多模型关联
Posted
技术标签:
【中文标题】CakePHP 多模型关联【英文标题】:CakePHP Multiple Model association 【发布时间】:2016-07-12 10:04:23 【问题描述】:我对 Cakephp 2.x 文档 Model Association 感到困惑,所以在这里需要一点帮助来连接并在结果中查找包含。
Deal Table > id | title
DealAttribute Table (has options) > id | title
DealAttributeOption Table (belongs to DealAttribute) > id | title | deal_attribute_id
DealsDealAttributes Table > id | deal_id | deal_attribute_id | option_id
需要类似的结果
Deal [
id, title
DealsDealAttributes [
id, deal_id, deal_attribute_id, option_id
DealAttribute [
title
]
DealAttributeOption [
title
]
]
]
我尝试使用$belongsTo
以及DealsDealAttributes
中的$hasAndBelongsToMany
以及所有三个Deal, DealAttribute, DealAttributeOption
,但没有得到包含。
现在我想如果我找到任何交易,那么所有相关的模型都将包含在内。如何建立模特协会?
【问题讨论】:
您是否定义了 $hasMany 和 $belongsTo 与各自模型的关系?还是您对此感到困惑?如果你遵循 cakephp 制作表格的约定,那么你也可以添加与蛋糕烘焙的模型关系.. 查看您现有的关联代码以了解您迄今为止所做的尝试会很有帮助。基本上,包含外键的表的模型具有belongsTo
关系,而与包含外键的另一个表关联的模型将是hasOne
或hasMany
关系。
@drmonkeyninja 我尝试了很多方法,但没有人工作,所以很困惑你能告诉我正确的方向吗?
@Anupal 从您当前的问题来看,您需要什么有点令人困惑。您能否包含架构的图像?
@drmonkeyninja 使用架构图像更新问题。
【参考方案1】:
看起来你的模型关联应该是这样设置的:-
class Deal extends AppModel
public $belongsTo = [
'User'
];
public $hasMany = [
'DealsDealAttribute'
];
class DealsDealAttribute extends AppModel
public $belongsTo = [
'Deal',
'DealAttribute',
'DealAttributeOption' => [
// Foreign key breaks naming convention so needs setting manually
'foreignKey' => 'option_id'
]
];
class DealAttribute extends AppModel
public $belongsTo = [
'User'
];
public $hasMany = [
'DealsDealAttribute'
];
class DealAttributeOption extends AppModel
public $hasMany = [
'DealsDealAttribute'
];
您需要在 DealsDealAttribute
模型中为 DealAttributeOption
关联设置外键,因为您违反了 CakePHP 的命名约定(理想情况下应该是 deal_attribute_option_id
)。
更新
然后要检索带有关联记录的交易,您可以使用contain
检索相关模型,如下所示:-
$result = $this->Deal->find('first', [
'contain' => [
'DealsDealAttribute' => [
'DealAttribute',
'DealAttributeOption'
]
],
'conditions' => [
'Deal.id' => $id
]
]);
【讨论】:
我也做了同样的事情,但是当我找到交易时,DealsDealAttribute
与它无关。
你在做什么来检索数据。听起来您的 find 查询是错误的!
$result = $this->Deal->findById($id);
这就是我在控制器中找到交易的方式。
@Anupal 您需要在查询中告诉 Cake contain
什么。我已经更新了我的答案以展示如何做到这一点。以上是关于CakePHP 多模型关联的主要内容,如果未能解决你的问题,请参考以下文章