问题标签 [class-table-inheritance]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - 学说类表继承不能删除()实体
我尝试实现 Doctrine 的类表继承。我的应用程序需要一个用户实体,用于通过Symfony的安全系统对用户进行身份验证。最重要的是,我的应用程序需要一种特殊的用户,医生。您可以在下面找到我的实体类的摘录。
用户类(基础):
医生实体扩展用户:
奇怪的是,我既不能删除Users
也不能Doctors
使用 EntityManager 的remove()
方法,我从来没有遇到过问题。当我使用该方法时,不会引发或记录任何错误,但 Entity 实例仍保留在数据库中。
我找到了一种解决方法,使用手动查询从数据库中删除对象。
所以我可以只使用上面的代码,但我仍然想知道是什么导致了这个问题的发生? 提前致谢!
mysql - 如何将描述符列定义为 Doctrine 中类表继承的 ENUM?
我想实现类表继承:
由于我运行“代码优先”方法,因此数据库由 Doctrine 生成:
鉴别器列foos.type
获取类型VARCHAR(255)
。我希望它得到一个ENUM
。
如何定义实体类的注解来获取ENUM
判别器?
doctrine - 具有自引用 ManyToMany 的继承实体:EXTRA_LAZY 获取模式不起作用
我必须遵循设置:父类
和几个持有对父级的引用的派生类(这里只显示一个)
现在,当通过 加载所有 MultiCompoundDataCategories 时
$this->getDoctrine()->getRepository(MultiCompoundDataCategory::class)->findAll()
,不仅在 MultiCompoundDataCategories 上发出一个选择(在 ManyToMany 表上连接)。相反,我得到一个主查询,然后是每个summand 的一个查询,每个查询都有一个大的胖序列LEFT JOIN
(文档也包含有关此问题的警告,我大量引用继承树的非叶节点)。
顺便说一句:LAZY
获取已经足以避免加载 ManyToMany 吗?
从这个评论中,我认为问题是我的子实体引用了父实体。我该如何规避这个?映射超类?
mysql - 对支持过滤不同类型的公共属性的 MySQL 模式设计的建议?
我想在 MySQL 中表示以下类型系统(这是一个分层类型系统,而不是分层数据):
它由继承树表示,如下所示:
本质上,我想在我的 MySQL 数据库中存储一组类型B
和(“叶”类型)的对象。C
我还想对我的一组对象运行下面的每个示例查询:
- 获取以SORT BY
偏移量 0 限制 10开头的类型
A
的对象name
tetra
name
- 获取类型为SORT BY
偏移量 10 限制 10
B
的对象color
blue
name
- 获取类型为SORT BY限制 10
C
的对象shape
square
id
我想知道满足这些要求的最佳 MySQL 模式是什么?
这是我目前的方法,尽管我有点犹豫是否要继续前进,因为它需要大量的非规范化:
因此,对于上述任何查询,我们都会参考该Objects
表来执行过滤/排序/分页。然后我们可以返回结果s 并在各个 ObjectOfType 表中id
解析这些s。id
这里的缺点是我们必须使“参考”表与所有单独的类型表保持同步,并且我们正在复制数据存储。
或者,我还考虑过运行多个单独的查询,然后在内存中加入它们。以查询#1(获取以SORT BY偏移量 0 限制 10开头的类型A
的对象)为例,方法是:name
tetra
name
- 获取以SORT BY限制 10开头的类型
B
的对象name
tetra
name
- 获取以SORT BY限制 10开头的类型
C
的对象name
tetra
name
- 合并结果并返回前 10 个。返回一个复杂的游标,该游标记录了我们从 B 和 C 中的每一个中提取了多少可用于后续分页的元素。
这种方法的一个缺点是这里的分页可能会变得非常复杂并为 MySQL 添加额外的工作,特别是如果类型系统具有高“扇出”。
任何有关此问题的提示将不胜感激。谢谢!
php - Doctrine class table inheritance mapping: why a foreign key to parent table?
Short question: can I avoid generating foreign keys for inherited classes to parent classes? Can a discriminator column for inherintance mapping be set in a relation owner instead of a parent class?
Explanation:
I am designing a model for invoices, where invoice subject can be 1 of 3 types:
- Contract
- Client
- Provider
After reading Doctrine inheritance mapping I think Class table inheritance is the one that best fits my needs.
Mapped superclass could better fit my needs if I could draw a relation from Invoice
to InvoiceSubject
, but I think I can't:
A mapped superclass cannot be an entity, it is not query-able and persistent relationships defined by a mapped superclass must be unidirectional (with an owning side only). This means that One-To-Many associations are not possible on a mapped superclass at all. Furthermore Many-To-Many associations are only possible if the mapped superclass is only used in exactly one entity at the moment.
Also, using an Interface could be a solution, but an interface in a relation can only be mapped to one entity.
So, this is my model:
But, when I try to generate the model (bin/console doctrine:schema:update --dump-sql
) I see its trying to create foreign keys from child classes to parent (tables already exist and have data):
This means that there will be collisions between id's coming from different tables or I will need to use different values in every table, none of the solutions are good. So, the question is:
- Is there a way to avoid this foreign key and set the discriminator in the relation owner class
Invoice
? In my case,InvoiceSubject
doen't actually need to exist as a table, I'm forced to create it as Class table inheritance forces me to do so. - Or, is this modelling completely wrong and I should use another aproach?
postgresql - 在基于 postgres 数据库的数据仓库中实现继承的最佳方法
我正在开发一个多步数据管道,应该优化以下过程:
1) 从NoSQL数据库 ( MongoDB ) 中提取数据。
2)将数据转换并加载到关系(PostgreSQL)数据库中。
3)使用Postgres数据库建立数据仓库
我手动编写了一个脚本来处理步骤 1) 和 2),这是一个中间 ETL 管道。现在我的目标是使用Postgres数据库构建数据仓库,但我对 DW 设计有一些疑问。下面是关系数据库的维度模型:
有 2 个主表,Occurrence和Canonical,从中继承了一组其他表(分别以红色和蓝色绘制)。请注意,有 2 个子数据类型ObserverNodeOccurrence和CanonicalObserverNode与另一个表具有额外的多对多关系。
我对如何在数据仓库中实现继承进行了一些研究,并认为最佳实践是将家庭数据类型(超级表和子表)合并到一个表中。这样做意味着添加额外的属性和大量的空值。我的新维度模型如下所示:
问题1:您认为这是解决这个问题的最佳方法吗?如果不是,那会是什么?
问题 2:有针对本地数据仓库的软件推荐吗?(内部部署是必须的,因为它包含敏感数据)
symfony - 使用必填字段查询 Doctrine 类表继承
我的域有一个父IncidenceMessage
类和几个子类(即IncidenceMessageText
)。我有以下类表继承配置:
我可以正确创建任何IncidenceMessage
实体。
只有一个IncidenceMessageText
in 数据库,当我尝试获取事件消息时,我收到以下错误:
(FileId
是一个值对象,表示 File 实体的 id)
IncidenceMessageImage
有File
一个外键字段,它是必需的。
File
Doctrine在IncidenceMessageText
没有该字段时获取对我来说毫无意义。
在调试时,我发现教义对每个IncidenceMessage
表都使用 LEFT JOIN 进行 SELECT,这调用了我的FileTypeId::convertToPHPValue
方法:
AFAIK,这里的问题是子类有必填字段,但这不应该是一个障碍,对吧?
symfony - 类表继承中的级联删除不会删除父行
我有一个名为 的父类Notification
,它有CommentNotification
一个子类(类表继承)。
在CommentNotification
中,我已包含onDelete = "CASCADE"
,因此当评论被删除时,附加到它的通知也会被删除。
根据要求,我也显示 ContentItemComment。这不包含与 CommentNotification 的双向关系。
但是,它成功删除了 in 中的行comment_notification
,但 in 中的行notification
仍然存在,在通知表中留下了我每次都必须手动删除的幽灵记录。
Fe 这个查询每天都会返回一些新的结果:
我错过了注释Notification
吗?
symfony - 当抽象超类实体中存在多对多、自引用关系时,Api 平台中出现“无法生成 IRI”错误
我有一个抽象实体“节点”超类,下面的代码是其他四个实体子类的基础。我想以任何顺序嵌套它们以创建一个松散的层次结构,其中任何类型的节点都可以是任何其他类型的父节点或子节点,并且任何节点都可以有多个父节点。
src/Entity/Node.php
此类由其他四个实体扩展,它们在 Symfony 5 项目中使用 Api 平台作为 ApiResource 公开。它们都有几乎相同的代码:
src/Entity/Project.php
暴露的实体显示在 Api Platform Dashboard 中,如果抽象 Node 实体没有自父子关系,可以查询成功。换句话说,如果我从 Node 类中删除所有 get/add/removeXXXXNodes 方法和相关变量,API 就可以工作。
但如果存在关系,则会出现 400 错误:
获取http://localhost/api/projects
问题似乎是 vendor/api-platform/core/src/Bridge/Symfony/Routing/IriConverter.php 中的 getItemIriFromResourceClass() 方法在节点与其他节点没有父子关系时接收空值。
有谁知道如何使这项工作?任何帮助表示赞赏。提前致谢。
参考:
doctrine-orm - 教义继承映射——在更新时添加级联到 id 字段
我已经用单独的表继承映射设置了我的数据,但是 Doctrine 似乎对它提供了非常有限的控制。
除其他问题外,我得到的一个问题是它仅在 DELETE 上级联。
(我使用 XML 映射)
据我所见,级联放置在关系标记内,而使用继承映射的 ID 列中不存在级联。
有没有简单的方法可以确保我的数据保持一致?(例如,如果从外部访问)?
没有这个,即使是对我的一条数据行的简单更新也会变得复杂,因为它会违反约束。
编辑@Cerad:这是一个示例工作示例。我使用 MariaDB 10.3.22