mysql - Symfony 中应该使用抽象关系还是使用普通的 ORM 关系?

标签 mysql doctrine-orm symfony

我正在重写一个Web应用程序,该应用程序是多年前由另一位程序员在cakePHP中编写的,并且该程序员没有将他的数据库设计为具有外键限制。我将快速解释 cakePHP 系统的缺陷。

  • “产品”表有一个名为“类型”的字段,可以是“正常”或“cpa”。 (不用担心CPA代表什么,并不重要)
  • “普通”产品每次在浏览器中被访问时都会在“跟踪”表中生成一个跟踪 ID。 “cpa”类型每次被访问时都会在“cpatrack”表中生成一个跟踪 ID。
  • (这是问题所在)购买产品时,会在“sales”表中创建一个条目,并且在 sales 表中有一个名为“track_id”的字段。如果产品类型为“普通”,则“跟踪”表中的 ID 存储在“track_id”中。如果产品是“cpa”,则“cpatrack”表中的 ID 存储在“track_id”中。

如果我正确设置 Symfony 并创建正确的关系,显然我不能让“track_id”字段引用多个实体,所以我现在需要做出决定。我研究了 Symfony 文档中的抽象关系,它主要用于防止包具有依赖关系,但它也可以让我在执行类似操作时选择正确的实体

$track = $sale->getTrackingId();

我应该考虑建立抽象关系来帮助解决这个问题,还是应该在销售表中创建另一个字段(例如“cpa_track_id”)并使用正常关系?有什么建议吗?

最佳答案

您不能为此使用抽象关系。抽象关系是一种将 bundle 彼此解耦的工具,但是,当在应用程序中使用具有抽象关系的 bundle 时,您必须在实现时决定关系指向哪个实体类。您无法在运行时决定它逐行指向哪个类。

如果您可以更改数据库架构,请查看 class table inheritance 。就像一个粗略的草图:

  • 创建新表tracking_hdr,其中包含列idtype(“cpa”或“normal”)以及匹配的继承映射( trackingcpatrack 是子实体表)
  • 假设您的 tracking_id 是一个有符号整数(通常都是这样,因为很多人都懒得添加 UNSIGNED... ) 并且所有现有值均为正数,请将 cpatrack 表中的所有 id 乘以 -1,以防止与 tracking 表发生冲突
  • 插入tracking_hdr(id,类型)从跟踪中选择id,“正常”;
  • 插入tracking_hdr(id,类型)从cpatrack中选择id,'cpa';
  • 更新 sales 表以否定 tracking_id(其中关联产品为“cpa”产品)
  • sales 表上创建指向 tracking_hdr 的外键

这样,对数据库模式的更改相对较小,尤其是旧的 cakephp 代码的只读访问应该仍然有效。但是,您应该记住,类表继承可能会对性能产生影响,因为如果您不小心,它很容易导致相当复杂的 JOIN 查询。

如果您无法对架构进行任何更改,我认为您运气不好,必须接受选项 1,getTrackingId()

关于mysql - Symfony 中应该使用抽象关系还是使用普通的 ORM 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41989666/

相关文章:

ajax - 如何根据用户选择获取实体的子项(即两个实体 A 和 B B 的列表基于所选的 A )

mysql - 如何更正字符串格式以防止语句中出现无效字符?

php - 为什么我在引入属性类型提示时突然收到 "Typed property must not be accessed before initialization"错误?

mysql(innodb)外键约束问题

symfony - 从 Dotrine 2.5 中的抽象类获取目标实体的存储库

php - 在 Doctrine 中,如何为 Entity 实现额外的模型功能

symfony - 如何在 “/api”文档api平台上添加我的自定义错误

php - Symfony2 从 api 数据填充选择列表

Mysql 根据条件分组求和

mysql 复杂选择,左连接