CakePHP 2.1 hasAndBleongsToMany还是hasMany通过?

时间:2012-04-26 13:34:05

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

我是CakePHP中hasAndBelongsToMany关系的新手。我正在尝试找出实现以下方案的最佳方法。我是否使用hasAndBelongsToMany或hasMany通过?

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

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

根据我在手册中阅读的内容,您不能在此类情况下使用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方法?

1 个答案:

答案 0 :(得分:1)

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

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

检索数据时,请使用CakePHP's Containable behavior

$this->RepairOrder->find('all',
    'contain' => array(
        'OpCode' => array(
            'Employee'
        )
    )
);