我正在开发一个电子书管理系统。我使用的是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。有什么我想念的吗?
答案 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”,则不必这样做。