2012-04-27 60 views
1

這只是我的第三個CakePHP應用程序,並且是第一個需要HABTM類型關聯的應用程序。我正在使用Cake 2.1,其中HABTM參數發生了變化,允許通過將'unique'鍵設置爲'keepExisting'來保存額外的信息。在一個正常的HABTM關聯中,你有一個包含兩個字段的表,每個外鍵。我想我需要一個3個外鍵。這可能通過使用'唯一'鍵,或者我應該使用hasMany通過關聯?CakePHP hasAndBelongsToMany vs 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方法?

回答

3

我發現唯一一件HABTM關係是標籤和多個類別。

我使用的任何類型的會員資格,友誼或跟隨關係都有很多,因爲有時候將附加數據附加到關係上是很好的,即使它只是被創建/修改。另一件讓我不喜歡HABTM的東西是替代所有更新邏輯。導致很多麻煩保存模型的不同部分。

+0

很酷,謝謝。有很多是通過它。 – Stewie 2012-04-27 17:30:47