【问题标题】:CakePHP 2.1 hasAndBleongsToMany or hasMany through?CakePHP 2.1 hasAndBleongsToMany 还是 hasMany 通过?
【发布时间】:2012-04-26 13:34:05
【问题描述】:

我不熟悉 CakePHP 中的 hasAndBelongsToMany 关系。我试图找出实现以下场景的最佳方法。我使用 hasAndBelongsToMany 还是 hasMany through?

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

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

从我在手册中读到的,在这种情况下你不能使用HABTM关系的原因是在保存数据时,原始信息首先被删除。但是,在 2.1 中,您可以设置一个“唯一”键,让它首先保留现有信息。那么我应该创建一个 HABTM 还是一个 hasMany through?

编辑

这是我的架构:

/* 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 方法?

【问题讨论】:

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


    【解决方案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'
            )
        )
    );
    

    【讨论】:

    • 抱歉,我的描述不清楚。操作码是一个单独的项目。他们有名字和一些价格。我将编辑我的帖子以提供更多信息。
    • 我不相信我会改变我的答案 - 我仍然认为不需要另一个表,也不需要另一个关联。您认为什么不适用于此设置?
    • 如果我更改操作码的价格,我不想在操作码表中的每个条目上都更改它
    • 所以……那就换一个吧。改变一个并不需要你全部改变。
    • 我有一个操作码 OCX,人工成本为 12 美元。我想将其分配给维修订单和员工。下一个维修订单来了,OCX 又来了,它得到了维修订单和员工。下一个出现了,它是 ATI,有自己的价格。它获得维修订单和员工。现在,当我想更改 OCX 操作码的价格时,我必须查看整个操作码表并更改每个操作码。正确的?还是我错过了什么?您在我的编辑中看到我的架构了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多