CakePHP 多模型关联

Posted

技术标签:

【中文标题】CakePHP 多模型关联【英文标题】:CakePHP Multiple Model association 【发布时间】:2016-07-12 10:04:23 【问题描述】:

我对 Cakephp 2.x 文档 Model Association 感到困惑,所以在这里需要一点帮助来连接并在结果中查找包含。

Deal Table > id | title
DealAttribute Table (has options) > id | title
DealAttributeOption Table (belongs to DealAttribute) > id | title | deal_attribute_id
DealsDealAttributes Table > id | deal_id | deal_attribute_id | option_id

需要类似的结果

Deal [
    id, title
    DealsDealAttributes [
        id, deal_id, deal_attribute_id, option_id
        DealAttribute [
            title
        ]
        DealAttributeOption [
            title
        ]
    ]
]

我尝试使用$belongsTo 以及DealsDealAttributes 中的$hasAndBelongsToMany 以及所有三个Deal, DealAttribute, DealAttributeOption,但没有得到包含。 现在我想如果我找到任何交易,那么所有相关的模型都将包含在内。如何建立模特协会?

【问题讨论】:

您是否定义了 $hasMany 和 $belongsTo 与各自模型的关系?还是您对此感到困惑?如果你遵循 cakephp 制作表格的约定,那么你也可以添加与蛋糕烘焙的模型关系.. 查看您现有的关联代码以了解您迄今为止所做的尝试会很有帮助。基本上,包含外键的表的模型具有belongsTo 关系,而与包含外键的另一个表关联的模型将是hasOnehasMany 关系。 @drmonkeyninja 我尝试了很多方法,但没有人工作,所以很困惑你能告诉我正确的方向吗? @Anupal 从您当前的问题来看,您需要什么有点令人困惑。您能否包含架构的图像? @drmonkeyninja 使用架构图像更新问题。 【参考方案1】:

看起来你的模型关联应该是这样设置的:-

class Deal extends AppModel 

    public $belongsTo = [
        'User'
    ];

    public $hasMany = [
        'DealsDealAttribute'
    ];



class DealsDealAttribute extends AppModel 

    public $belongsTo = [
        'Deal',
        'DealAttribute',
        'DealAttributeOption' => [
            // Foreign key breaks naming convention so needs setting manually
            'foreignKey' => 'option_id'
        ]
    ];



class DealAttribute extends AppModel 

    public $belongsTo = [
        'User'
    ];

    public $hasMany = [
        'DealsDealAttribute'
    ];



class DealAttributeOption extends AppModel 

    public $hasMany = [
        'DealsDealAttribute'
    ];


您需要在 DealsDealAttribute 模型中为 DealAttributeOption 关联设置外键,因为您违反了 CakePHP 的命名约定(理想情况下应该是 deal_attribute_option_id)。

更新

然后要检索带有关联记录的交易,您可以使用contain 检索相关模型,如下所示:-

$result = $this->Deal->find('first', [
    'contain' => [
        'DealsDealAttribute' => [
            'DealAttribute',
            'DealAttributeOption'
        ]
    ],
    'conditions' => [
        'Deal.id' => $id
    ]
]);

【讨论】:

我也做了同样的事情,但是当我找到交易时,DealsDealAttribute 与它无关。 你在做什么来检索数据。听起来您的 find 查询是错误的! $result = $this->Deal->findById($id); 这就是我在控制器中找到交易的方式。 @Anupal 您需要在查询中告诉 Cake contain 什么。我已经更新了我的答案以展示如何做到这一点。

以上是关于CakePHP 多模型关联的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 模型关联 HasMany - 保存错误

CakePHP 模型关联深层模型包含

CakePHP 3:保存关联模型失败

在 CakePHP 中保存时如何验证关联模型是不是存在

CakePHP 中的多级模型关联

CakePHP 2.1 - 保存(和创建)多个连接模型和关联模型