2

我有一个 PostgreSQL 表,其中包含, , ...t列。由于效率原因,我需要在通过 Doctrine 水合所有对象之前过滤实体集合。但是,Doctrine 的类太有限了,因为它必须工作在 PHP 对象级别(水化后)和 SQL 级别(水化后)。因此,我决定创建一个基本上反映表的 SQL 视图,并添加一个额外的动态列,用于在 SQL 级别评估表达式。因此我有t1t2CriteriaT

CREATE VIEW v AS SELECT t.*, (t.t1 <> t.t2) AS flag FROM t AS t;

(注:上面的布尔表达式 forflag实际上要复杂得多。它在此处用作占位符。)

Doctrine 实体T链接到视图而不是表,并且有一个附加字段$flag。我ORM\ChangeTrackingPolicy( "NOTIFY" )在这个实体类上使用,使得该字段$flag永远不会被标记为脏,并且 Doctrine 永远不会将它包含在UPDATE语句中。在 PHP 级别,该字段$flag与通过适当的 getter/setter 形成布尔表达式的字段保持同步。

如果视图的字段是同一个表的基本表达式,PosgreSQL 支持INSERT INTO,UPDATE和on 视图。DELETE

问题:如果一个新实体第一次被持久化,Doctrine 将该字段包含$flagINSERT INTO语句中,即使$flag被标记为不脏。这将触发以下 SQL 异常:“错误:无法插入视图“v”的列“标志”详细信息:不是其基本关系列的视图列不可更新。

有什么方法可以告诉 Doctrine 不包括此列?有没有办法将列标记为只读?

4

0 回答 0