これは私の 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 スルー アプローチを使用する必要がありますか?