【发布时间】:2012-04-26 13:34:05
【问题描述】:
我不熟悉 CakePHP 中的 hasAndBelongsToMany 关系。我试图找出实现以下场景的最佳方法。我使用 hasAndBelongsToMany 还是 hasMany through?
在我的应用程序中,我正在创建维修订单。维修订单具有分配给员工的操作码。每个维修订单可以有多个操作码。所以,我很可能会有类似以下的内容:
RepairOrder1 - OpCode1 由 Employee1 完成,OpCode2 由 Employee2 完成
从我在手册中读到的,在这种情况下你不能使用HABTM关系的原因是在保存数据时,原始信息首先被删除。但是,在 2.1 中,您可以设置一个“唯一”键,让它首先保留现有信息。那么我应该创建一个 HABTM 还是一个 hasMany through?
编辑
这是我的架构:
/* 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
);
我正在尝试为维修订单分配多个操作码,并跟踪执行该特定操作码的员工。所以我可以有一个带有 3 个操作码的维修订单,每个操作码都有不同的员工。所以我认为这需要另一个表,例如:
/* repair_order_assignments */
CREATE TABLE repair_order_assignments (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
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 方法?
【问题讨论】:
标签: cakephp has-and-belongs-to-many has-many-through