我们继承了一个 3rd 方数据库模式,其中几个表使用数据库设计模式,其中表不直接定义外键,而是通过组合两列的方式来定义一些表:
- 指定表名称的列:
- 直接(ENUM
type
) - 或通过另一个表(
type_id
引用表types
,然后在 varchar 列中包含表名)
- 直接(ENUM
- 从所述表中指定 PK 值的列(例如
type_value
)
这会导致一行引用一个表而另一行可能引用一个完全不同的表的情况。
我们可以使用查询构建器并为每个场景手动定义 JOIN 和 WHERE 子句,但是为每个外部表拥有一个属性并使用 WHERE 子句仅过滤目标表结果会更实用,例如:
class Foo {
private $id; // PK for Foo
private $type; // string (enum), e.g. 'bar' or 'baz'
private $type_id; // contains PK of Bar or Baz, respectivelly
private $bar; // references entity Bar
private $baz; // references entity Baz
}
我设法找到的最接近我们需要的是使用 Criteria API 在 getter 方法中动态更新 WHERE 子句(如此处所示)。
但是,在这种情况下,我完全不知道如何设置 Doctrine 注释。Doctrine 是否支持这样的数据库模式,或者我们是否必须退回到通过查询构建器或 DQL 手动构建每个查询?