0

我是 CakePHP 中 hasAndBelongsToMany 关系的新手。我试图找出实现以下场景的最佳方法。我使用 hasAndBelongsToMany 还是 hasMany through?

在我的应用程序中,我正在创建维修订单。维修订单具有分配给员工的操作码。每个维修订单可以有多个操作码。所以,我很可能会有类似于以下的内容:

RepairOrder1 - OpCode1 由 Employee1 完成,OpCode2 由 Employee2 完成

从我在手册中阅读的内容来看,您不能在这种情况下使用 HABTM 关系的原因是,在保存数据时,会首先删除原始信息。但是,在 2.1 中,您可以设置一个“唯一”键,让它首先保留现有信息。那么我是通过创建一个 HABTM 还是一个 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
);

我正在尝试为维修订单分配多个操作代码,并跟踪哪个员工执行了该特定操作代码。所以我可以有一个带有 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 方法?

4

1 回答 1

1

我认为您在这种情况下都不会使用:

OpCode belongsTo RepairOrder
OpCode belongsTo Employee
RepairOrder hasMany OpCode
Employee hasMany OpCode

检索数据时,请使用CakePHP 的 Containable 行为

$this->RepairOrder->find('all',
    'contain' => array(
        'OpCode' => array(
            'Employee'
        )
    )
);
于 2012-04-26T15:23:03.760 回答