首页 > 解决方案 > 如何将 Spatie 媒体库与 Backpack 一起用于 Laravel 上传字段?

问题描述

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

我最好的选择是什么?

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

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

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

是否有另一种方法可以在不使用 mutator/创建额外的 DB 字段的情况下做到这一点?

标签: laravel-backpack

解决方案


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

Laravel 文档定义访问器

Laravel 文档定义 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 创建和更新文件了。您可以根据自己的需要和要求更改实施。


推荐阅读