CakePHP hasAndBelongsToMany vs hasMany 通过

Posted

技术标签:

【中文标题】CakePHP hasAndBelongsToMany vs hasMany 通过【英文标题】:CakePHP hasAndBelongsToMany vs hasMany through 【发布时间】:2012-04-27 13:45:29 【问题描述】:

这只是我的第三个 Cakephp 应用程序,也是第一个需要 HABTM 类型关联的应用程序。我正在使用 Cake 2.1,其中对 HABTM 参数进行了更改,允许通过将“唯一”键设置为“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 through 方法?

【问题讨论】:

【参考方案1】:

我发现 HABTM 关系的唯一对象是标签和多个类别。

我使用的任何类型的会员、友谊或追随关系都有很多通过,因为有时将额外的数据附加到关系中会很好,即使它是刚刚创建/修改的。让我对 HABTM 感到失望的另一件事是更新时替换所有内容的逻辑。保存模型的不同部分会造成很多麻烦。

【讨论】:

以上是关于CakePHP hasAndBelongsToMany vs hasMany 通过的主要内容,如果未能解决你的问题,请参考以下文章

php [cakephp:mysqldump] mysqldumpのcakephp実装サンプル。#php #cakephp #mysql

ORM如何在CakePHP3中运行

使用 Cakephp-jwt-auth [CakePHP 3] 过期后颁发新令牌

从 cakephp 3.x 迁移到 cakephp 4.x [关闭]

CakePHP 2.2.1 - 在表单上显示 CakePHP 错误 - 自定义验证

php [cakephp:AuthComponent示例] AuthComponent的示例代码。 #cakephp