Inherited() 标志:propertyName 与 storageName

Inherited() Flag: propertyName vs. storageName

我正在寻找一些信息/文档,这有助于我理解为什么在继承情况下(ManyToOne 或 OneToOne)连接不是使用存储名称而是使用 属性 名称完成的相应的实体对象 class ...有人可以向我解释一下底层机制吗?

我指的特殊情况是,当连接字段不是外键时。特别是我指的是这个代码部分:

ManyToOneJoinBuilder.php, line 57

当涉及没有外键时,连接将使用属性名称发生,但显然这不能与存储名称相同...并生成错误...当结果 sql 被执行时!

数据库中需要有额外的字段table,其中外键以读取优化的方式保存。这里的约定是使用 属性 名称作为列名称。

来自文档

For every inherited field you have to add a binary column to the entity, which is used for saving the inherited information in a read optimized manner

如果您查看 product 的列,您会发现名为 manufacturertaxdeliveryTime 的列。这些是存储 FK 获取的列,用于加入匹配关联。

这是数据抽象层所必需的,因此它可以加入关联的 table 而无需读取父实体的行。这极大地提高了性能,因为您可以在一个 SQL 查询中加入多个关联,并且数据库可以针对该查询进行优化。否则,您需要首先读取实体和父实体,只是为了弄清楚某些关联是否从父实体继承到子实体,以及在哪个 FK 上执行连接。

docs.

的这一部分对此进行了简短描述

我希望这能回答你的问题。