Database cakePHP-从数据库检索。模特儿协会及;数据库

Database cakePHP-从数据库检索。模特儿协会及;数据库,database,cakephp,cakephp-model,Database,Cakephp,Cakephp Model,问这个问题让我觉得非常愚蠢,但我很困惑,可能是因为我对cakePHP有点害怕(对它来说是新的,也不是很舒服),但它的优点实际上迫使我使用它。如果你能帮忙,我很感激: 我的问题是理解模型关联是如何工作的。在阅读了所有关于关联的部分之后,我仍然在苦苦挣扎,实际上不太确定我的数据库设计是否有缺陷,或者模型之间的关联是否错误 这是:我有3种型号,它们是: 供体,血型,DonorType 首先,我不完全确定是否应该为数据库中的每个表创建一个模型。 我的桌子是这样的: +-------donors-----

问这个问题让我觉得非常愚蠢,但我很困惑,可能是因为我对cakePHP有点害怕(对它来说是新的,也不是很舒服),但它的优点实际上迫使我使用它。如果你能帮忙,我很感激:

我的问题是理解模型关联是如何工作的。在阅读了所有关于关联的部分之后,我仍然在苦苦挣扎,实际上不太确定我的数据库设计是否有缺陷,或者模型之间的关联是否错误

这是:我有3种型号,它们是: 供体,血型,DonorType

首先,我不完全确定是否应该为数据库中的每个表创建一个模型。 我的桌子是这样的:

+-------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->捐赠者->bloodGroups->查找('list'), 数组('fields'=>array( “血型,血型,血型id”,“血型,血型” ) ) ));

因此,我认为协会是正确的。但是,现在我想显示存储的用户以及相关的详细信息,但是生成了一个sql错误:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'BloodGroup.donor_id' in 'on clause'
这当然是因为血型表中没有作为fk的“捐赠者id”,实际上在捐赠者表中有作为fk的血型id。
那么解决这个问题的办法是什么呢?db设计是否有缺陷,或者我是否有办法重新定义cake中的关联

您的设置似乎有两个问题

  • 您没有遵循蛋糕数据库约定。除非您束手无策(例如您无法控制的外部数据源),否则您的主键应始终被称为
    id
    ,而不是
    table\u name\u id
    。默认情况下,Cake始终查找
    id
    键。如果没有选择,可以通过在模型中设置属性来设置自定义主键
  • 看着你的桌子,你似乎把自己搞混了。即使用简单的英语来说,捐献者只有一个血型听起来是合乎逻辑的,但从数据库的角度来看,捐献者属于某个血型。手册中有一些注释可帮助您选择正确的注释:
  • hasOne:另一个型号包含外键。
    belongsTo:当前模型包含外键

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

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

    感谢您澄清hasOne/belongsTo。。关于主键,如果我需要
    echo$this->Form->input('blood\u-group\u-id')echo$this->Form->input('type\u-id')
    你可以从
    捐献者的表单中完美地完成这项工作。如果您遵循惯例,将
    $bloodGroups
    $type
    设置为视图的数组,Cake甚至可以进一步帮助您,它将创建包含相关模型中所有可能值的下拉列表。首先,非常感谢Oldskool!第二,是的,我目前正在这样做!那么,我如何告诉cakePHP血型表的
    $this->Form->input('id')
    和捐献者类型表的
    $this->Form->input('id')
    是不同的呢?它内部知道吗?@user2678538你不应该有两个同名的输入,你应该有
    $this->Form->create('provider')$此->表单->输入('sensor.blood_group_id')$此->表单->输入('donator.donator_type_id')
    ,它应该会保存您需要的所有数据,当从控制器将
    $bloodGroups
    $donorTypes
    设置到您的视图时,它会自动填充下拉列表。@Oldkool感谢您的回复,我只是在做
    echo$this->Form->input('blood\u group\u id')
    echo$this->->Form->->->input('sensor\u type\u id)
    分别,即未明确指定型号!我猜按照你描述的那样做是一种很好的做法?