2014-01-23 46 views
0

我觉得相当不错的愚蠢张贴了这个问题,但即时通讯彻底难倒了(可能是因为IM相当新的蛋糕,有点吓倒)..CakePHP的 - 数据检索 - 模特协会与数据库设计

     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输入,都很好。

然而,当我尝试检索捐献记录出现此错误

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'BloodGroup.donor_id' in 'on clause'

这ofcours意味着CakePHP是寻找FK donor_id内blood_groups表。然而,这种关系是相反的,fk存储在捐助者表中。

我不知道数据库设计是否有缺陷,或者是否需要在蛋糕中重新定义关联。请帮忙,因为我对CakePHP很陌生,因为它的优点,我实际上被迫使用它。 我已阅读关于蛋糕模型中的模型之间的关联的所有部分,但我仍在挣扎。我怎么去解决这个问题?

回答

2

为了得到这个数据库的建立,这是正确的工作ASSOCS是:

  • 捐赠属于关联血型
  • 捐赠属于关联DonorType
  • 血型的hasMany捐助
  • DonorType的hasMany捐助

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

模型字段被认为是较低的下标和下划线,PK预计只是id,FKs是assoc,singular的模型名称,后缀为_id。捐助者表中的PK是正确的。

为什么你甚至改变自己的约定? DonorId vs blood_group_id作为PKs?但是,如果您想要将它们命名为您想要的名称,但您必须在任何地方明确声明它们。见linking models

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

+0

对于DonorID,这是一个粘贴的早期版本,我在实施前更改了一个。这个问题昨天发布了两次,但似乎没有发布,因此我转发了它。这是原来的帖子: http://stackoverflow.com/questions/01/cakephp-retrieving-from-database-models-associations-database/21321330?noredirect = 1#comment32139276_21321330 – LogixMaster

+0

无论如何,我确实得到了博客教程,并且实际上发现它非常简单,还有我需要了解OO背景以了解发生了什么(至少我是这么认为的)。在这两篇文章中,你们都给出了很好的答案,现在我意识到这些约定是一个很重要的因素!而且你是唯一一个给我所需要的关系的人,也就是我错过了hasMany rel。因此,荣誉!这就是我接受你的答案的原因 我应该离开帖子还是删除重复的帖子? – LogixMaster

1

变化的供体模型:

我在BloodGroup和条件在DonorType加入FOREIGNKEY:

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') 
      ) 
     ); 

原因上述错误:如果外键不相关联阵列限定然后CakePHP的假定tablename_id是foreignKey。

+0

谢谢你的回答也是正确的,因为你指定fk需要在关联中明确定义,如果不遵循蛋糕的约定! – LogixMaster