1

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

4

1 に答える 1

3

HABTM 関係がタグと複数のカテゴリだけであることを発見しました。

私が使用するあらゆる種類のメンバーシップ、友情、または次の関係には、作成/変更されたばかりであっても、関係に追加のデータを添付すると便利な場合があるため、多くのことがあります。HABTM から私を遠ざけるもう 1 つのことは、更新時にすべてを置換するロジックです。モデルのさまざまな部分を保存するのは面倒です。

于 2012-04-27T15:41:27.440 に答える