繁体   English   中英

如何在CakePHP3中运行事务,同时检索上一个插入ID,并且对PostgreSQL和MySQL都有效?

[英]How do I run transactions in CakePHP3 while retrieving last insert id and work for both PostgreSQL and MySQL?

我正在使用CakePHP 3.x

在CakePHP 3.x中有一种执行事务的方法

但是,我的某些execute语句需要前面的insert语句的ID。

在选择CakePHP 3.x并允许将PostgreSQL或MySQL作为数据库时,如何在事务中执行该操作?

我期望的查询是这样的:

INSERT INTO dynamic_views (`title`, `created`) values ('view 37', NOW());

-- take the id of the above insert query and assuming the view id is 37
INSERT INTO users_access_dynamic_views(user_id, view_id) values (44, 37);

我想使用CakePHP3.x使用事务执行以上操作。

同时,我想问一下在上述情况下使用事务处理是否被认为是一个坏主意?

执行插入查询后,可以使用正确的参数调用lastInsertId()以获取正确的值:

$connection->transactional(function ($connection) {
    $statement = $connection->newQuery
        ->insert($fields)
        ->into($table)
        ->values($values)
        ->execute();

     $insertId = $statement->lastInsertId($table, 'id'); // id is primary key
});

在MySQL中获取最后插入的id的函数称为last_insert_id() ,而在PostgreSQL中为lastval() 因此,要么必须在两者之间创建一些映射,要么必须检查CakePHP中使用的驱动程序,然后调用特定的函数。

例如,您可以在PostgreSQL中创建以下函数。

CREATE FUNCTION last_insert_id() RETURNS BIGINT AS $$
  SELECT lastval();
$$ LANGUAGE sql VOLATILE;

然后,您可以在第二个查询中调用它,它在MySQL和PostgreSQL中都可以使用。

INSERT INTO users_access_dynamic_views
  (user_id, view_id)
VALUES
  (44, LAST_INSERT_ID());

还请记住,PostgreSQL使用序列来生成ID,因此当涉及到触发器(将数据自己插入某处)时,仅依赖lastval可能会产生意外结果。 因此,最好总是通过currval指定明确涉及的序列。

CURRVAL(PG_GET_SERIAL_SEQUENCE('dynamic_views', 'view_id'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM