Php 条令2和Postgres,非主键列上的序列字段

Php 条令2和Postgres,非主键列上的序列字段,php,postgresql,doctrine-orm,Php,Postgresql,Doctrine Orm,如何在非主键列上使用原则2中的串行数据类型 条令可以使用序列列作为主键,生成器策略设置为序列或标识,但生成器不能用于非主键列 我有这样的桌子: fields: order: type: integer nullable: false column: '"order"' options: default: DEFAULT 创建表测试( 默认情况下作为标识

如何在非主键列上使用原则2中的串行数据类型

条令可以使用序列列作为主键,生成器策略设置为序列或标识,但生成器不能用于非主键列

我有这样的桌子:

fields:
        order:
            type: integer
            nullable: false
            column: '"order"'
            options:
                default: DEFAULT
创建表测试(
默认情况下作为标识生成的id整数不为null,
订单序列号
)
约束测试主键(id)
条令实体:

App\Entity\Test:
    type: entity
    table: test

    id:
        id:
            type: integer
            nullable: false
            id: true
            generator:
                strategy: SEQUENCE
            sequenceGenerator:
                sequenceName: test_id_seq
    fields:
        order:
            type: integer
            nullable: false
            column: '"order"'
我想要的是,当我向这个表中插入新行时,我不必显式地指定顺序,但db应该处理它

原则上,生成的sql代码应如下所示:

fields:
        order:
            type: integer
            nullable: false
            column: '"order"'
            options:
                default: DEFAULT
插入测试(默认,默认);
在没有任何配置的情况下,条令试图在列“order”中插入null,导致错误“无法在notnull字段中插入null值”

我尝试的 我尝试在php实体类中为“order”属性设置默认值,如下所示:

fields:
        order:
            type: integer
            nullable: false
            column: '"order"'
            options:
                default: DEFAULT
private$order='DEFAULT'
但这被错误地解释为“整数的语法无效”

然后我尝试将选项放入yaml定义中,如下所示:

fields:
        order:
            type: integer
            nullable: false
            column: '"order"'
            options:
                default: DEFAULT
那没什么区别

然后我尝试创建名为order的自定义类型,但也失败了

自定义类型的代码:

使用条令\DBAL\Types\Type;
类OrderType扩展类型
{
公共函数getName():字符串
{
返回“订单”;
}
公共函数convertToDatabaseValue($value,AbstractPlatform$platform)
{
如果(是数值($value)){
返回$value;
}
返回“默认值”;
}
公共函数convertToDatabaseValueSQL($sqlExpr,AbstractPlatform$platform)
{
返回“默认值”;
}
公共函数canRequireSQLConversion():bool
{
返回true;
}
公共函数getSQLDeclaration(数组$fieldDeclaration,抽象平台$platform)
{
返回“序列号”;
}
}
这会导致错误“SQLSTATE[HY093]:参数编号无效:未定义参数”,这是convertToDatabaseValueSQL方法的问题。当我注释掉它并使用默认实现时,错误“SQLSTATE[22P02]:无效的文本表示:7错误:整数的输入语法无效:“default”

它仍然引用单词DEFAULT,但我需要它不被引用,它必须用作关键字而不是字符串

我认为自定义类型应该适合shomehow。在旧的Zend Framework v1中,有一个Zend_Db_Exp类,当在sql语句中使用时,该类没有被引用,而值按原样使用。我想我需要类似的东西

版本信息 PHP7.3

博士后11


Doctrine ORM 2.6(如果需要,我将升级)

DB触发器可用于管理行为不端的客户端,在本例中,基于Doctrine 2的应用程序

创建触发函数:

create or replace function public."t_setDefaultValueOnOrderField"()
    returns trigger as
$body$
declare
    fq_table_name text := '"' || TG_TABLE_SCHEMA || '"' || '.' || '"' || TG_TABLE_NAME || '"';
    sequence_name text := pg_get_serial_sequence(fq_table_name, 'order');
begin
    if NEW.order is null then
        NEW.order := nextval(sequence_name);
    end if;

    return NEW;
end;
$body$ language plpgsql;
并将其附在桌子上:

创建触发器“setDefaultValueOnOrderField”
插入前
论公共考试
每行
执行过程public。“t_setDefaultValueOnOrderField”();
这是一个仅针对订单字段的特殊触发器,它可能适用于处理目标表中存在的任何串行字段


在找到更好的解决方案之前,这将作为公认的答案。