在INSERT INTO期间,Make Doctrine跳过字段/列是只读的

时间:2016-10-11 18:44:21

标签: sql doctrine-orm persistence hydration

我有一个PostgreSQL表t,列t1t2,....由于效率原因,我需要在为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 INTOUPDATEDELETE

问题:如果第一次将Doctrine字段$flag包含在INSERT INTO语句中,那么即使$flag被标记为非脏,也会保留新实体。这会触发以下SQL异常:“错误:无法插入视图中的”标志“视图”v“详细信息:查看不是基本关系列的列不可更新。”

有没有办法告诉Doctrine不包括这个专栏?有没有办法将列标记为只读?

0 个答案:

没有答案