Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP 3-如何插入没有自动递增主键ID的记录_Php_Cakephp_Cakephp 3.0 - Fatal编程技术网

CakePHP 3-如何插入没有自动递增主键ID的记录

CakePHP 3-如何插入没有自动递增主键ID的记录,php,cakephp,cakephp-3.0,Php,Cakephp,Cakephp 3.0,我使用的是一个旧表架构,它的主键不是标准的自动递增id。相反,主键是VARCHAR(15),格式如下: ABC10001 ABC10002 ABC10003 ABC10004 ABC10005 是否有方法设置模型表,以便在插入新行时自动生成序列中的下一个ID 是否有方法设置模型表,以便在插入新行时自动生成序列中的下一个ID 使用回调函数并实现一个方法来生成下一个id public function beforeSave(Event $event, EntityInterface $entity

我使用的是一个旧表架构,它的主键不是标准的自动递增id。相反,主键是VARCHAR(15),格式如下:

ABC10001
ABC10002
ABC10003
ABC10004
ABC10005
是否有方法设置模型表,以便在插入新行时自动生成序列中的下一个ID

是否有方法设置模型表,以便在插入新行时自动生成序列中的下一个ID

使用回调函数并实现一个方法来生成下一个id

public function beforeSave(Event $event, EntityInterface $entity) {
     if ($entity->isNew()) {
         $entity->id = $this->generateId();
     }
}

public function generateId() {
    // Your implementation here.
}

通常,为了生成自定义的新主键值,您可以使用

  • 实现/重写
    \Cake\Database\type::newId()

  • 在相应的表类中重写的
    \Cake\ORM\Table::\u newId()
    方法,默认情况下,该方法要求与列关联的类型提供新ID(通过
    type::newId()

  • Model.beforeSave
    回调

  • 或者数据库中的触发器

在您的情况下,您需要访问特定的存储库,因此类型类感觉是错误的,因为考虑到类型实例正在被全局重用和配置,它很难在不同的存储库中使用

就我个人而言,我可能会使用触发器,以确保最顶层的完整性,如果出于任何原因无法使用触发器,则选择第二个选项,因为它只在需要时调用,也就是在插入数据之前调用,生成的值仅在数据不包含主键值的情况下使用。您所需要做的就是读取最后一个/最高的ID,并返回它的增量
1


您尝试过什么?保存一个主键值设置为该格式的实体有什么问题?@ndm只是想知道是否有一种干净的方法可以设置Table类来自动查找最后一个ID,增加数字,并在插入时将其用作主键。而不是每次在控制器中手动设置ID。只是提前提出问题,以便我开始工作时有一些想法。我明白了,但这使问题变得不同,至少在目前的形式下,这不是你想要的:)我建议编辑你的问题,以便它反映你的实际需要。