0

CakePHP の hasAndBelongsToMany 関係は初めてです。次のシナリオを実装する最善の方法を見つけようとしています。hasAndBelongsToMany または hasMany を介して使用しますか?

私のアプリケーションでは、修理注文を作成しています。修理注文には、従業員に割り当てられたオペレーション コードがあります。修理注文ごとに複数の Op Code が存在する場合があります。したがって、次のようなものになる可能性があります。

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

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 に答える