cakePHP-从数据库中检索。模特协会&数据库

时间:2014-01-23 22:51:35

标签: database cakephp cakephp-appmodel

对于提出这个问题我感到非常愚蠢,但我感到困惑,可能是因为我对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。 那么这个解决方案是什么?数据库设计是否存在缺陷,或者有没有办法重新定义蛋糕内的关联?

1 个答案:

答案 0 :(得分:2)

您的设置似乎有两个问题。

  1. 您没有遵循Cake数据库约定。除非您的双手被绑定(例如您无法控制的外部数据源),否则应始终将主键称为id,而不是table_name_id。 Cake默认情况下始终查找id个键。如果您别无选择,可以通过在模型中设置primaryKey属性来设置自定义主键。
  2. 通过查看您的表格,您似乎将hasOnebelongsTo混为一谈。即使用简单的英语,捐赠者有一个血型也是合乎逻辑的,从数据库的角度来看,捐赠者属于某个血型。本手册有一些注释可帮助您选择正确的注释:
  3.   

    hasOne: 其他模型包含外键。
       belongsTo: 当前模型包含外键。

    文档中的一些示例也说明了这一点(参见上面的链接)。后一种情况在您的情况下是正确的,因此您的模型最终应如下所示:

    class Donor extends AppModel {
    
        public $belongsTo = array(
            'BloodGroup',
            'DonorType'
        );
    
    }