如何将 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 额外的数据库字段来做到这一点?
您可以通过覆盖 set 和 get 来避免在数据库中创建未使用的 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 创建和更新文件了。
您可以根据您的需要和要求更改实现。
我想在 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 额外的数据库字段来做到这一点?
您可以通过覆盖 set 和 get 来避免在数据库中创建未使用的 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 创建和更新文件了。 您可以根据您的需要和要求更改实现。