绕过cakePHP的HABTM自动魔术的最佳方法是什么?

时间:2012-06-20 19:44:34

标签: cakephp has-and-belongs-to-many cakephp-2.1

我的问题与此答案有关。 https://stackoverflow.com/a/8773953/1297775

我在许多地方读过,@ deceze认为: “老实说,对于任何中途复杂的应用程序,依赖于Cake对HABTM关系的自动处理可能变得非常脆弱且难以调试,所以我总是自己管理HABTM记录。”

甚至CakePHP书都提示它http://book.cakephp.org/2.0/en/models/saving-your-data.html#what-to-do-when-habtm-becomes-complicated

我想问一下,当他说'管理'这个HABTM记录自己时,他是否......

1)根本不在模型中创建HABTM关系并为连接表创建模型

OR

2)在模型中创建HABTM关系,但不要在控制器代码中使用它只需使用$ this-> FirstModel-> JoinModel-> saveAll($ someData);

由于

1 个答案:

答案 0 :(得分:2)

基本上,您需要使用hasManyThrough关系,这实际上是手动设置HABTM,允许您向关系添加额外数据(例如创建/过期日期)。这很简单,您只需要创建一个模型来加入它们并使用模型中的普通belongsTohasMany属性,这里是一个简单的用户/成员/课程设置:

class User extends AppModel {
    public $hasMany = array('Membership');
}

class Course extends AppModel {
    public $hasMany = array('Membership');
}

class Membership extends AppModel {
    public $belongsTo = array('User', 'Course');
}

memberships表所需的唯一字段(至少)为course_iduser_id

现在,您可以将Membership模型作为普通模型进行操作,而不会将Cake视为HABTM,并在保存记录时使用其自动魔法。您还可以在成员资格模型上使用酷counterCache来计算课程用户数等。