【问题标题】:cakePHP- retrieving from database. Models Associations & databasecakePHP- 从数据库中检索。模型协会和数据库
【发布时间】:2014-01-23 22:51:34
【问题描述】:

问这个问题我觉得很愚蠢,但我很困惑,可能是因为我对 cakePHP 有点害怕(对它来说是新的,而且不是很舒服),但它的优点实际上迫使我使用它。因此,如果您能提供帮助,我将不胜感激:

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

这里是:我有 3 个模型,它们是: 供体、血型、供体类型

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

+-------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', 数组('字段' => 数组( 'BloodGroup.blood_group_id','BloodGroup.blood_group' ) ) ));

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

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

这当然是因为 BloodGroup 表中没有作为 fk 的“donor_id”,实际上在供体表中存在作为 fk 的 blood_group_id。 那么解决这个问题的方法是什么? db 设计有缺陷还是有办法重新定义 cake 中的关联?

【问题讨论】:

    标签: database cakephp cakephp-model


    【解决方案1】:

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

    1. 您没有遵循 Cake 数据库约定。除非您的双手被束缚(例如您无法控制的外部数据源),否则您的主键应始终称为id,而不是table_name_id。 Cake 默认总是寻找 id 键。如果您别无选择,您可以通过在模型中设置 primaryKey 属性来设置自定义主键。
    2. 通过查看您的表格,您似乎将hasOnebelongsTo 混淆了。尽管用简单的英语来说,捐献者有一个血型听起来合乎逻辑,但从数据库的角度来看,捐献者属于某个血型。手册中有一些说明可帮助您选择正确的说明:

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

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

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

    【讨论】:

    • 感谢澄清hasOne/belongsTo..关于主键,如果我需要echo $this->Form->input('blood_group_id') echo $this->Form->input('type_id')
    • 您可以通过Donor 的表单完美地做到这一点。如果您遵循约定并将 $bloodGroups$type 设置为视图数组,Cake 甚至可以进一步帮助您,它会创建包含相关模型中所有可能值的下拉列表。
    • 首先,非常感谢 Oldskool!其次,是的,我目前正在这样做!那么我将如何告诉 cakePHP 用于 blood_group 表的$this->Form->input('id') 和用于donor_type 表的$this->Form->input('id') 不一样?它是否以某种方式在内部知道?
    • @user2678538 你不应该有两个同名的输入,你应该有$this->Form->create('Donor'); $this->Form->input('Donor.blood_group_id'); $this->Form->input('Donor.donor_type_id');,这应该保存你需要的所有数据,并且在将$bloodGroups$donorTypes设置到你的视图时从您的控制器中,它将自动填充下拉列表。
    • @Oldkool 感谢您的回复,我只是分别做了echo $this->Form->input('blood_group_id')echo $this->Form->input('donor_type_id),即没有明确指定型号!我猜它的好习惯是按照你的描述去做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多