如何将 Spatie Media Library 与 Backpack 一起用于 Laravel 上传字段?

How can I use Spatie Media Library with Backpack for Laravel upload field?

我想在 Laravel 的 Backpack 中上传文件,并立即使用 Spatie 媒体库将该文件附加到模型。

我最好的选择是什么?

我尝试按照文档中的建议使用 SetImageAttribute 修改器来执行此操作:https://backpackforlaravel.com/docs/4.1/crud-fields#upload-1

public function setImageAttribute($value) {
    $this->addMedia('image');
}

然而,这种方法要求我在数据库上有一个未使用的“图像”字段(因为 Spatie 媒体库使用它自己的 table)。

是否有另一种方法可以不使用 mutator/creating 额外的数据库字段来做到这一点?

您可以通过覆盖 setget 来避免在数据库中创建未使用的 image 字段 mutators/accessor 在您的模型上。

Laravel documentation defining accessor

Laravel documentation defining mutator

在您的模型上创建以下 2 个方法:

    public function getImageAttribute()
    {
        return $this->getFirstMediaUrl('image') ?? '';
    }

    public function setImageAttribute($file)
    {
        $this->clearMediaCollection('image'); // to remove any previous files

        if ($file) {
            $this->addMedia($file)->usingFileName($file->hashName())->toMediaCollection('image');
        }
    }

如果您的模型上有可填充集,也请向其中添加图像。

protected $fillable = ['image']

现在您应该可以使用 Backpack 创建和更新文件了。 您可以根据您的需要和要求更改实现。