Laravel-替代型号ID

时间:2018-07-31 12:30:11

标签: php laravel uuid

我正在开发一个电子书管理系统。我使用的是UUID,而不是自动递增的整数主键,它可以正常工作:

protected static function boot()
{
    parent::boot();

    static::creating(function ($model) {
        $model->{$model->getKeyName()} = Uuid::generate()->string;
    });
}

我还禁用了模型上的PK增量:

public $incrementing = false;

现在,EPUB标准建议出版商在可能的情况下为每本书分配一个UUID,因此,我认为,如果文件提供了UUID,则可以使用现有的UUID,否则可以为图书馆生成一个新的UUID。
因此,我将id添加到模型的$fillable数组中,并在我的create控制器方法中有条件地设置了ID:

if (array_key_exists('uuid', $epubMetaData)) {
    $book->id = $epubMetaData['uuid'];
}

然后,我填充其余字段并$book->save()本书。即使$epubMetaData数组中有一个UUID,它也最终以新生成的UUID结束。因此,我怀疑Laravel决定忽略我的ID。有什么我想念的吗?

2 个答案:

答案 0 :(得分:4)

好吧,您不必检查ID是否已在创建回调中设置:

static::creating(function ($model) {
    if (!$model->id) {
       $model->id = Uuid::generate()->string;
    }
});

答案 1 :(得分:0)

要禁用自动递增(因此要禁用Laravel对id列的管理),可以在模型中添加一个公共的$ incrementing属性并将其设置为false:

public $incrementing = false;

您还可以在模型中设置受保护的$ primaryKey属性,以覆盖默认ID列的名称:

protected $primaryKey = 'uuid';

当然,如果您的列名为“ id”,则不必这样做。