我有一个PostgreSQL表t
,列t1
,t2
,....由于效率原因,我需要在为Doctrine保护所有对象之前过滤实体的集合。但是,Criteria
类的Doctrine太有限了,因为它必须在PHP对象(水合后)和SQL级(水合后)上工作。因此,我决定创建一个基本上镜像表T
的SQL视图,并添加一个额外的动态列来评估SQL级别的表达式。因此我有
CREATE VIEW v AS SELECT t.*, (t.t1 <> t.t2) AS flag FROM t AS t;
(N.b。:flag
的上述布尔表达式实际上要复杂得多。它在这里充当占位符。)
Doctrine实体T
链接到视图而不是表格,并且还有一个字段$flag
。我在此实体类上使用ORM\ChangeTrackingPolicy( "NOTIFY" )
,以便字段$flag
永远不会标记为脏,并且Doctrine永远不会将其包含在UPDATE
语句中。在PHP级别,字段$flag
通过适当的getter / setter与形成布尔表达式的字段保持同步。
如果视图的字段是同一个表的基本表达式,PosgreSQL支持INSERT INTO
,UPDATE
和DELETE
。
问题:如果第一次将Doctrine字段$flag
包含在INSERT INTO
语句中,那么即使$flag
被标记为非脏,也会保留新实体。这会触发以下SQL异常:“错误:无法插入视图中的”标志“视图”v“详细信息:查看不是基本关系列的列不可更新。”
有没有办法告诉Doctrine不包括这个专栏?有没有办法将列标记为只读?