【问题标题】:Laravel 8: photo_id does not added to users table at One To Many relationshipLaravel 8:photo_id 未在一对多关系中添加到用户表中
【发布时间】:2021-05-11 21:41:50
【问题描述】:

我正在使用 Laravel 8 开发我的项目,在这个项目中,我有一个用于添加新用户和上传他们的个人资料图片的页面。

现在在 Controller 的 store(),我编写了这个代码:

public function store(Request $request)
{
    $user = new User();

    $validate_data = Validator::make(request()->all(),[
        'name' => 'required|min:4',
        'email' => 'required|email|unique:users',
        'status' => 'required',
        'role' => 'required',
        'password' => 'required|min:6',
    ])->validated();

    if($file = $request->file('avatar')){
        $name = time() . $file->getClientOriginalName();
        $file->move('images', $name);
        $photo = new Photo();
        $photo->name = $file->getClientOriginalName();
        $photo->path = $name;
        $photo->user_id = Auth::id();
        $photo->save();

        $user->photo_id = $photo->id;   //Adding photo id to the new user at users table
     }

      $creation = User::create([
          'name' => $validate_data['name'],
           'email' => $validate_data['email'],
           'status' => $validate_data['status'],
           'role_id' => $validate_data['role'],
           'password' => bcrypt($validate_data['password'])
       ]);

       if($creation){
           alert()->success('User was added', 'Success');
           return redirect('/admin/users/');
        } else {
            return '1003';
        }
    }

它工作正常且正确,并将新用户添加到users 表并将照片添加到photos 表。

但是应该将photo_id 添加到users 表的这一行不起作用,并且新用户的photo_id 不知何故为空!

User 和 Photo Models 之间的关系是这样的:

User.php:

public function photos()
{
    return $this->hasMany(Photo::class);
}

Photo.php:

public function user()
{
    return $this->belongsTo(User::class);
}

我还在用户模型中添加了photo_id 作为fillbale

那么这里出了什么问题?我该如何解决这个问题?

我非常感谢您对此提出任何想法或建议...

提前致谢。

这里是迁移,如果你想看看:

create_photos_table表:

public function up()
{
    Schema::create('photos', function (Blueprint $table) {
        $table->increments('id');
        $table->string('path');
        $table->string('name');
        $table->bigInteger('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');
        $table->timestamps();
    });
}

add_avatar_to_users_table:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->integer('photo_id')->unsigned()->nullable();
    });
}

【问题讨论】:

    标签: php laravel laravel-8


    【解决方案1】:

    add_avatar_to_users_table迁移中将integer改为bigInteger如下:

    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->integer('photo_id')->unsigned()->nullable();
        });
    }
    

    从代码中删除以下行:

    $user = new User();
    

    更新以下代码块:

    $creation = User::create([
        'name' => $validate_data['name'],
        'email' => $validate_data['email'],
        'status' => $validate_data['status'],
        'role_id' => $validate_data['role'],
        'password' => bcrypt($validate_data['password']),
        'photo_id' => isset($photo) ? $photo->id : null
    ]);
    

    【讨论】:

    • 但是如果他是一对多的关系,他为什么要定义一个photo_id呢?
    • 是的,你是对的。我认为 tejoslaeslio 想为每个用户存储一个图像。如果是这样,他必须按如下方式更改关系: public function photo() { return $this->belongsTo(Photo::class); }
    • 没错,这让我很困惑 :)
    • @tejoslaeslio 你想要什么?
    【解决方案2】:

    您需要保存该模型:

    $user->save()
    

    否则你所做的更改对数据库没有影响

    【讨论】:

      【解决方案3】:

      有3件事:

      1. 如果您的用户可以拥有许多照片,那么您将不需要用户表中的 photo_id,因为所有照片都有一个 user_id,因此是一对多关系

      2. 您定义$user = new User() 并将值分配给该对象。但稍后您将使用此代码创建一个新用户:

       $creation = User::create([
                  'name' => $validate_data['name'],
                  'email' => $validate_data['email'],
                  'status' => $validate_data['status'],
                  'role_id' => $validate_data['role'],
                  'password' => bcrypt($validate_data['password'])
              ]);
      

      因此,您有 2 个用户模型,其中只有一个被保存到数据库中。

      最后,如果您将 auth()->id() 保存为照片的 user_id,则照片将不属于正确的用户。您首先必须创建用户,然后获取此 ID。

      【讨论】:

        【解决方案4】:

        您商店的某些代码有误 一开始你用

         $user = new User();
        

        之后

        $creation = User::create([
            'name' => $validate_data['name'],
            'email' => $validate_data['email'],
            'status' => $validate_data['status'],
            'role_id' => $validate_data['role'],
            'password' => bcrypt($validate_data['password'])
        ]);
        

        使用此代码

        $user->name=$validate_data['name'];
        $user->email=$validate_data['email'];
        $user->status=$validate_data['status'];
        $user->role_id=$validate_data['role'];
        $user->password=bcrypt($validate_data['password']);
        $user->save();
        

        【讨论】:

          猜你喜欢
          • 2021-07-31
          • 2021-03-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-30
          • 2021-11-18
          • 2015-05-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多