我正在使用旧表模式,其主键不是标准的自动递增ID。相反,主键是VARCHAR(15),格式为:
foo
有没有办法设置模型表,以便在插入新行时自动生成序列中的下一个ID?
答案 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
递增。
见