CakePHP hasAndBelongsToMany vs hasMany through

时间:2012-04-27 13:45:30

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

这只是我的第3个CakePHP应用程序,也是第一个需要HABTM类型关联的应用程序。我正在使用Cake 2.1,其中对HABTM参数进行了更改,允许通过将“unique”键设置为“keepExisting”来保存额外信息。在普通的HABTM关联中,您有一个包含2个字段的表,每个字段都有一个外键。我想我需要一个有3个外键的。这可以通过使用“唯一”键,还是应该通过关联使用hasMany?

这是我的架构:

/* repair_orders */
CREATE TABLE repair_orders (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    number VARCHAR(16),  //Auto-generated repair order number 
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL
);

/* Employees */
CREATE TABLE employees (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(16), 
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL
);

/* op_codes */
CREATE TABLE op_codes (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(16),
    sale_material DECIMAL(10,2),
    cost_material DECIMAL(10,2), 
    created DATETIME DEFAULT NULL,
    modified DATETIME DEFAULT NULL
);

操作码基本上是一个项目列表及其成本。

维修订单可以包含许多操作码。我还需要跟踪每个维修订单上分配给特定操作码的员工。所以我认为这需要另一个表,例如:

/* repair_order_assignments */
CREATE TABLE repair_order_assignments (
    repair_order_id INT(16),
    op_code_id INT(16),
    employee_id INT(16)
);

所以我的协会将是:

Repair_Order_Assignment hasMany Employee, Op_Code
Employee belongsTo Repair_Order_Assignment
Op_Code belongsTo Repair_Order_Assignment

Repair_Order_Assignment hasAndBelongsToMany Repair_Order
Repair_Order hasAndBelongsToMany Repair_Order_Assignment

根据手册,当保存hasAndBelongsToMany关联时,首先删除关联。由于未在新插入中替换,因此会丢失列中的额外数据。但是,它继续注意到在2.1中有一个唯一的变量可以设置为保存额外的数据。这个设置是使用唯一键还是我应该使用hasMany through方法?

1 个答案:

答案 0 :(得分:3)

我发现HABTM关系的唯一标签就是标签和多个类别。

我使用的任何类型的成员资格,友谊或后续关系都有很多,因为有时将额外数据附加到关系中会很好,即使它刚刚被创建/修改。让我摆脱HABTM的另一件事是替换 - 更新后的一切逻辑。保存模型的不同部分会造成很多麻烦。