cakePHP - 数据检索 - 模型关联&数据库设计

时间:2014-01-23 23:24:28

标签: database cakephp cakephp-appmodel

我觉得这个问题非常愚蠢,但我完全感到困惑(可能是因为我很新蛋糕而且有点吓人)..

                      hasOne               hasOne

       donors         |      blood_groups     |       donor_types

Att ------------------+-----------------------+---------------------+           
    DonorID (pk)      |   blood_group_id (pk) |     type_id (pk)    |
    Name              |   group               |     type            |
    Surname           |                       |                     |
    type_id(fk)       |                       |                     |
    blood_group_id(fk)|                       |                     |

捐助者模式

class Donor extends AppModel{
    public $hasOne = array(
        'BloodGroup'=> array(
            'className' => 'BloodGroup'

        ),
        'DonorType' => array(
            'className' => 'DonorType'
        )
    );

我已经使用关联模型在捐赠者注册视图中填充FormHelper输入,一切都很好。

但是,当我尝试检索供体记录时,会发生此错误

  

错误:SQLSTATE [42S22]:找不到列:1054未知列   'on clause'中的'BloodGroup.donor_id'

这个ofcours意味着cakePHP正在查找blood_groups表中的fk donor_id。然而,这种关系是另一种方式,fk存储在捐赠者表中。

我不知道数据库设计是否存在缺陷,或者是否需要在蛋糕内重新定义关联。请帮助,因为我对CakePHP很新,我实际上因为它的优点而被迫使用它。 我已经阅读了关于蛋糕文档中模型之间关联的所有部分,但我仍在努力。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

要获得此数据库设置,正确的工作将是:

  • Donor belongsTo BloodType
  • Donor belongsTo DonorType
  • BloodType hasMany Donor
  • DonorType hasMany Donor

但你的外键错了:Follow the CakePHP conventions!

模型字段应该是较低的套接字和下划线,PK应该只是id,FK是assoc的模型名称,单数,带有后缀_id的下划线。捐助者表中的PK是正确的。

为什么你甚至改变自己的约定? DonorId vs blood_group_id为PKs?但是,如果你想让它们像你想要的那样混乱,那么你必须在任何地方明确地声明它们。请参阅linking models

我建议你在弄乱框架之前先做the blog tutorial以完成一个真正的项目。

答案 1 :(得分:1)

更改您的捐赠者模型,如下所示:

我在BloodGroup中添加了foreignKey,在DonorType中添加了条件:

  class Donor extends AppModel{
        public $hasOne = array(
            'BloodGroup'=> array(
                'className' => 'BloodGroup',
                'foreignKey' => 'blood_group_id'

            ),
            'DonorType' => array(
                'className' => 'DonorType',
                'conditions' => array('Donor.type_id' => 'DonorType.type_id')
            )  
        );

上述错误的原因:如果未在关联数组中定义foreignKey,则CakePHP假定tablename_id为foreignKey。