Laravel - 覆盖模型 ID

Laravel - Override model ID

我正在开发电子书管理系统。我使用的是 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() 这本书。它以一个新生成的 UUID 结束,即使 $epubMetaData 数组中有一个……所以我怀疑 Laravel 决定忽略我的 ID。有什么我错过的吗?

要禁用自动递增(并因此通过 Laravel 管理您的 id 列),您可以添加一个 public $incrementing 属性 到您的模型并将其设置为 false :

public $incrementing = false;

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

protected $primaryKey = 'uuid';

当然,如果您的专栏名为 "id",则不必这样做。

好吧,您没有检查是否已在创建回调中设置了 id:

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