postgresql 实现nextval();Laravel序列

h5qlskok  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(1)|浏览(167)

如何在Laravel项目中实现从PostgreSQL到ID生成器的nextval();函数?
我已经尝试了ChatGPT的建议,但它不工作,我也搜索了有关nextval的文档,但仍然不能让它在我的项目中工作。
这是我生成ID的函数,我的ID生成规则是,在生成未分配的ID之前,它将扫描StudentModelPersonModel的学生ID和ID列,然后ID将以前缀20开头,并且长度必须仅为7位。生成ID号没有问题,但我希望在我的函数中实现nextval()

Route::get('/check-student-id', function() {
    $prefix = "20";
    $lastId = max(StudentModel::max('Student ID'), PersonModel::max('id'));
    $suffix = str_pad(($lastId % 100000) + 1, 5, '0', STR_PAD_LEFT);
    $newId = $prefix . $suffix;
    $existingIds = array_merge(
        StudentModel::pluck('Student ID')->toArray(),
        PersonModel::pluck('id')->toArray()
    );

    while (in_array($newId, $existingIds)) {
        $suffix = str_pad(($suffix % 100000) + 1, 5, '0', STR_PAD_LEFT);
        $newId = $prefix . $suffix;
    }

    return $newId;
});
s1ag04yj

s1ag04yj1#

nextval用于获取SEQUENCE的下一个值,您所要求的与此无关,您只需要为id字段给予一个默认值。
这可以通过在创建模型时更新字段来实现

class YourModel extends Model
{
    public static function booted()
    {
        static::creating(function ($model) {
            ... logic here
            $model->id = $newId;
        });
    }
}

这仅限于在使用Eloquent来持久化数据时才起作用。
如果您希望无论如何持久化数据,表都能自动获得该值,那么您需要在数据库中实现该逻辑

相关问题