Laravel Nova:存储相关文件记录的外键(包含文件路径)

问题描述 投票:0回答:1

此问题与Laravel Nova 2.5有关。

我有一个User(Nova)资源类,其中包含一个“文件”字段。我不希望文件路径存储在我的用户数据库表中,而是存储在一般的“文件”数据库表中。

我在Laraval Nova文档中找到了此代码段,其中解释了如何在相关表中存储文件路径。但是我不确定如何在用户表中设置FK字段(file_id)(由于通过Nova存储用户资源时,此字段现在为NULL)。我发现的摘录来自:

https://nova.laravel.com/docs/2.0/resources/file-fields.html#customizing-file-storage

use Illuminate\Http\Request;

File::make('Attachment')
    ->store(function (Request $request, $model) {
        return function () use ($resource, $request) {
            $media = $resource->media()->updateOrCreate([], [
                'path'=> $request->file('attachment')->store('/path', 'public')
        ]);
    };
});

我的用户表如下:

  • id(主键)
  • file_id(unsigned int)
  • 用户名(varchar:255)
  • 电子邮件(varchar:255)
  • created_at(datetime)
  • updated_at(日期时间)

我的文件表如下:

  • id(主键)
  • 原始名称(varchar:255)
  • generated_name(varchar:255)
  • created_at(datetime)
  • updated_at(日期时间)

谢谢。

php mysql laravel-nova laravel-6
1个回答
0
投票

而不是命名“文件”表,而是选择名称“项”,因为表的Nova资源将与“使用Laravel \ Nova \ Fields \ File;”相同。

您问题的基本解决方案:

// database\migrations\2019_11_01_103838_create_items_table.php
        Schema::create('items', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('original_name',255);
            $table->string('generated_name',255);
            $table->timestamps();
        });

// database\migrations\2019_11_01_104145_add_column_item_id_to_users_table.php
        Schema::table('users', function (Blueprint $table) {
            $table->unsignedBigInteger('item_id')->nullable();
            $table->foreign('item_id')->references('id')->on('items');
        });

// app\Nova\User.php
    public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),

            Gravatar::make(),

            Text::make('Name')
                ->sortable()
                ->rules('required', 'max:255'),

            Text::make('Email')
                ->sortable()
                ->rules('required', 'email', 'max:254')
                ->creationRules('unique:users,email')
                ->updateRules('unique:users,email,{{resourceId}}'),

            Password::make('Password')
                ->onlyOnForms()
                ->creationRules('required', 'string', 'min:8')
                ->updateRules('nullable', 'string', 'min:8'),

            File::make('Item file')
                ->store(function (Request $request, $model) {
                    $oldName = $request->item_file->getClientOriginalName();
                    $newName = 'user_file_'.$oldName;
                    // Check file of user is exist or not
                    $user = \App\User::where('email',$request->email)->first();
                    if(!$user){
                        $item = new \App\Item;
                        $item->original_name = $oldName;
                        $item->generated_name = $newName;
                        $item->save();
                        $model['item_id'] = $item->id;
                    }else{
                        $item = \App\Item::find($user->item_id);
                        if(!$item){
                            $item = new \App\Item;
                            $item->original_name = $oldName;
                            $item->generated_name = $newName;
                            $item->save();
                            $model['item_id'] = $item->id;
                        }else{
                            $item->original_name = $oldName;
                            $item->generated_name = $newName;
                            $item->save();
                        }
                    }
                    // return $newName;
                    $request->item_file->storeAs('public',$newName);
                })
                ->onlyOnForms(),
            Text::make('Item File Id','item_id')->exceptOnForms()

        ];
    }

// app\Observers\UserObserver.php = To delete the variable $model['item_file'] generate by File::make('Item file') in field User Nova resources.
<?php
namespace App\Observers;
use App\User;
class UserObserver
{
    public function saving(User $user)
    {
        unset($user->item_file);
    }
}

// app\Providers\AppServiceProvider.php = To register the UserObserver
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Observers\UserObserver;
use App\User;
class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        User::observe(UserObserver::class);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.