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

时间:2016-06-01 11:22:11

标签: php cakephp cakephp-3.0

我正在使用旧表模式,其主键不是标准的自动递增ID。相反,主键是VARCHAR(15),格式为:

foo

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

2 个答案:

答案 0 :(得分:2)

  

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

使用beforeSave()回调并实现一种方法来生成下一个ID。

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

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

答案 1 :(得分:0)

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

  • 实现/覆盖\Cake\Database\Type::newId()

  • 的自定义类型类
  • 相应表类中的重写\Cake\ORM\Table::_newId()方法,默认情况下会询问与该列关联的类型以获取新ID(通过Type::newId()

  • Model.beforeSave回调

  • 或数据库中的触发器

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

我个人可能会使用触发器以确保最高级别的完整性,并且如果由于某种原因无法使用它们,请选择第二个选项,因为它仅在它被调用的地方被调用。需要,也就是说,正好在插入数据之前,并且仅在数据不包含主键值的情况下才使用生成的值。您需要做的就是读取最后/最高ID,然后按1递增。