对于提出这个问题我感到非常愚蠢,但我感到困惑,可能是因为我对cakePHP(新的,并不是很舒服)有点恐惧,但它的优点实际上迫使我使用它。所以,如果你能提供帮助,我很感激:
我的问题在于了解模型关联的工作原理。在完成关于协会的所有部分之后,我仍在努力,实际上我不确定我的数据库设计是否存在缺陷,或模型之间的关联是否错误。
这是:我有3个模型,它们是: Donor,BloodGroup,DonorType
首先,我不完全确定是否应该为db中的每个表创建一个模型。 我的表看起来像这样:
+-------donors-------+
| donor_id (pk) |
| name |
| surname |
| donor_type_id (fk) |
| blood_group_id (fk)|
| |
+--------------------+
+----donor_types-----+
| type_id (pk) |
| type |
| |
+--------------------+
+----blood_groups----+
| blood_group_id(pk) |
| group |
| |
+--------------------+
捐赠者模型
class Donor extends AppModel{
public $hasOne = array(
'BloodGroup'=> array(
'className' => 'BloodGroup'
),
'DonorType' => array(
'className' => 'DonorType'
)
);
根据数据库中的表格,上面是如何描述关系。我已经在使用该关联来注册一个新的捐赠者,其中包含从血型表/模型中检索到的值,在我的控制器中使用此代码:
$ this-> set('bloodGroups',$ this-> Donor-> BloodGroup-> find('list', array('fields'=> array( 'BloodGroup.blood_group_id', 'BloodGroup.blood_group' ) ) ));
因此我认为这种关联是正确的。但是,现在我想显示存储的用户的相关详细信息,但是生成了一个sql错误:
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'BloodGroup.donor_id' in 'on clause'
这是因为在BloodGroup表中没有'donor_id'作为fk,实际上在捐赠者表中有一个blood_group_id作为fk。 那么这个解决方案是什么?数据库设计是否存在缺陷,或者有没有办法重新定义蛋糕内的关联?
答案 0 :(得分:2)
您的设置似乎有两个问题。
id
,而不是table_name_id
。 Cake默认情况下始终查找id
个键。如果您别无选择,可以通过在模型中设置primaryKey属性来设置自定义主键。hasOne: 其他模型包含外键。
belongsTo: 当前模型包含外键。
文档中的一些示例也说明了这一点(参见上面的链接)。后一种情况在您的情况下是正确的,因此您的模型最终应如下所示:
class Donor extends AppModel {
public $belongsTo = array(
'BloodGroup',
'DonorType'
);
}