提问者:小点点

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

但是当我试图检索捐赠者记录时,会出现这个错误

错误:SQLSTATE[42S22]:未找到列:1054未知列“BloodGroup”。捐赠者id“在”on子句中”

这意味着cakePHP正在血型表中查找fk捐赠者id。然而,关系是相反的,fk存储在表中。

我不知道db设计是否有缺陷,或者是否需要在蛋糕中重新定义关联。请帮助,因为我是cakePHP的新手,我实际上被迫使用它,因为它的优点。我已经阅读了蛋糕文档中所有关于模型之间关联的部分,但我仍然在挣扎。我该怎么做呢?


共2个答案

匿名用户

要获得正确的数据库设置,ASSOC将:

  • 捐献者遗物血型
  • 捐赠者物品到捐赠者类型
  • 血型有很多捐献者
  • 捐赠者类型有很多捐赠者

但是您的外键是错误的:遵循CakePHP约定!

模型字段应小写并加下划线,PKs应仅为id,FKs是assoc的模型名称,单数,带后缀_id下划线。捐赠者表中的PKs是正确的。

你为什么要改变自己的惯例?DonorId vsblood_group_idPKs?然而,如果你想引起混乱,就像你想的那样命名它们,但是你必须在任何地方明确声明它们。请参见链接模型。

我建议你在弄乱框架之前先做博客教程,以完成一个真正的项目。

匿名用户

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

我在血型中添加了外键,在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')
            )  
        );

以上错误的原因:如果在关联数组中没有定义外键,那么CakePHP假设tablename_id是外键。