【问题标题】:PHP Phalcon. Use postgres nextval(sequence) in modelPHP 法尔康。在模型中使用 postgres nextval(sequence)
【发布时间】:2019-09-04 15:42:56
【问题描述】:

我在 Postgres 中有一张像这样的 DDL 表:

CREATE TABLE robots(
    robot_id INTEGER NOT NULL CONSTRAINT robot_id_pkey PRIMARY KEY,
    name TEXT
);

我知道我可以使用以下 SQL 语句插入记录:

INSERT INTO robots (robot_id, name) VALUES (nextval('robots_seq'), 'WALL-E');

我需要在 Phalcon 中为此表进行 CRUD 操作。我也想使用 ORM 功能。
所以我这样做:

$robot = new Robots();
$robot->setRobotId(new \Phalcon\Db\RawValue("nextval('robots_seq')"));
$robot->setName('WALL-E');
$robot->save();

并得到以下异常:

Uncaught PDOException: SQLSTATE[22P02]: Invalid text representation:
7 ERROR: invalid input syntax for integer: 'nextval('robots_seq')';

有没有办法做到这一点?

【问题讨论】:

    标签: php postgresql phalcon


    【解决方案1】:

    Phalcon 假设您的具有串行(自动增量)列的模型将具有名为 [table_name]_[column_name]_seq 的序列。

    在你的情况下,为了让 Phalcon 处理自动递增列,你应该有一个名为 robots_robot_id_seq 的序列,而不是 robot_id 列的 robots_seq (顺便说一下,我只称它为“id”)。

    这样您在创建对象时不必担心设置 id,保存后 Phalcon 会自动为您填写该字段:

    CREATE TABLE robots(
    robot_id SERIAL PRIMARY KEY NOT NULL,
    name TEXT
    );
    
    $robot = new Robots();
    $robot->setName('WALL-E');
    $robot->save();
    $robot->getRobotId(); // Should return last "nextval()" sequence
    

    希望对你有帮助。

    【讨论】:

    • 谢谢。不幸的是我不能改变robots表的DDL结构,因为我有一个robots的热表,我们称之为robots_hot,在这个表中我使用serial主列和序列robots_seq它。我用 Phalcon ORM 在其中插入行,一切都很好;然后,当某个事件到来时,我将所有行从robots_hot 复制到robots。但有时,我必须绕过robots_hot,直接在robots 中插入一行。这就是问题所在。使用原始 sql 查询临时解决了它。
    【解决方案2】:

    要告诉 Phalcon 模型序列的名称是什么,请使用函数 getSequenceName:

    public function getSequenceName() {
        return 'category_id_seq';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      相关资源
      最近更新 更多