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

Php Laravel Nova:存储相关文件记录(包含文件路径)的外键,php,mysql,laravel-nova,laravel-6,Php,Mysql,Laravel Nova,Laravel 6,这个问题与拉威尔新星2.5有关 我有一个用户(Nova)资源类,它包含一个“文件”字段。 我不希望文件路径存储在我的users DB表中,而是存储在常规的“files”DB表中 我在Laraval Nova文档中找到了这个代码片段,该文档解释了如何在相关表中存储文件路径。但我不确定如何在我的users表中设置FK字段(file_id)(因为现在,当通过Nova存储用户资源时,该字段保持为空)。我找到的片段来自: 我的用户表如下所示: id(原始密钥) 文件id(无符号整数) 用户名(varc

这个问题与拉威尔新星2.5有关

我有一个用户(Nova)资源类,它包含一个“文件”字段。 我不希望文件路径存储在我的users DB表中,而是存储在常规的“files”DB表中

我在Laraval Nova文档中找到了这个代码片段,该文档解释了如何在相关表中存储文件路径。但我不确定如何在我的users表中设置FK字段(file_id)(因为现在,当通过Nova存储用户资源时,该字段保持为空)。我找到的片段来自:

我的用户表如下所示:

  • id(原始密钥)
  • 文件id(无符号整数)
  • 用户名(varchar:255)
  • 电子邮件(varchar:255)
  • 创建于(日期时间)
  • 更新于(日期时间)
我的文件表如下所示:

  • id(原始密钥)
  • 原始名称(varchar:255)
  • 生成的\u名称(varchar:255)
  • 创建于(日期时间)
  • 更新于(日期时间)

谢谢。

我选择“items”这个名称,而不是命名“files”table,因为table的Nova资源将与“use 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);
    }
}
//database\migrations\2019\u 11\u 01\u 103838\u create\u items\u table.php
Schema::create('items',函数(Blueprint$表){
$table->bigIncrements('id');
$table->string('original_name',255);
$table->string('generated_name',255);
$table->timestamps();
});
//数据库\migrations\2019\u 11\u 01\u 104145\u添加\u列\u项\u id\u到\u用户\u table.php
Schema::table('users',函数(Blueprint$table){
$table->unsignedBigInteger('item_id')->nullable();
$table->foreign('item_id')->references('id')->on('items');
});
//app\Nova\User.php
公共功能字段(请求$Request)
{
返回[
ID::make()->sortable(),
Gravatar::make(),
Text::make('Name')
->可排序的()
->规则('required','max:255'),
Text::make('Email')
->可排序的()
->规则('必需','电子邮件','最大值:254')
->creationRules('唯一:用户,电子邮件')
->updateRules('unique:users,email,{{resourceId}}'),
密码::make('Password')
->onlyOnForms()
->creationRules('必需'、'字符串'、'最小值:8')
->updateRules('nullable','string','min:8'),
文件::make('项目文件')
->存储(功能(请求$Request$model){
$oldName=$request->item_file->getClientOriginalName();
$newName='user\u file.'$oldName;
//检查用户的文件是否存在
$user=\App\user::where('email',$request->email)->first();
如果(!$user){
$item=new\App\item;
$item->original_name=$oldName;
$item->generated_name=$newName;
$item->save();
$model['item_id']=$item->id;
}否则{
$item=\App\item::find($user->item\u id);
如果(!$项目){
$item=new\App\item;
$item->original_name=$oldName;
$item->generated_name=$newName;
$item->save();
$model['item_id']=$item->id;
}否则{
$item->original_name=$oldName;
$item->generated_name=$newName;
$item->save();
}
}
//返回$newName;
$request->item_file->storeAs('public',$newName);
})
->onlyOnForms(),
Text::make('Item File Id','Item_Id')->exceptOnForms()
];
}
//app\observer\UserObserver.php=删除字段User Nova resources中的变量$model['item_file']generate by file::make('item 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);
    }
}