【问题标题】:Laravel 8: Role ID Does Not Submitted Into One To Many RelationshipLaravel 8:角色 ID 未提交到一对多关系中
【发布时间】:2021-07-31 01:24:14
【问题描述】:

我在我的项目中使用 Laravel 8,在这个项目中,我想在 usersroles 表之间应用 OneToMany 关系。

所以在模型中,我添加了这些:

Role.php:

public function users()
{
    return $this->hasMany(Role::class);
}

User.php:

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

然后为了创建新用户,我添加了这个表单域:

<div class="form-group">
   <label class="col-sm-2 control-label">Role</label>
   <select class="form-control" name="role" dir="ltr">
       @foreach(\App\Models\Role::all() as $role)
         <option value="{{ $role->id }}">{{ $role->name }}</option>
      @endforeach
   </select>
</div>

在 Store 方法中,我编写了这样的代码:

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

    $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){
        return redirect()->back();
    }else{
        return '1003';
    }
}

但现在的问题是,每当我尝试添加新用户时,它都会成功添加到表users,但列role_id 将保持为空:

当我说 dd($request); 时,它会打印:

如您所见,它存储了role,但我不知道为什么它没有将其保存在数据库中!

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

非常感谢你们的任何想法或建议......

提前致谢。

【问题讨论】:

    标签: php laravel laravel-8


    【解决方案1】:

    您的模型上很可能没有role_id 作为$fillable

    class User {
        $fillable = [
            ...,
            'role_id',
        ];
    }
    

    将关系填充为属性并不是最佳的,它可能导致关系为空,即使您只是填充了数据。正确的做法是使用associate()方法调用。如果找不到角色,这也提供了返回 404 的好处,因为您必须在 associating() 它之前获取角色。在大多数API's 中,如果关系不存在并且只是更健壮的代码,这将是标准,以避免来自SQL 的外键错误。

    $user = new User([
        'name' => $validate_data['name'],
        'email' => $validate_data['email'],
        'status' => $validate_data['status'],
        'password' => bcrypt($validate_data['password'])
    ]);
    
    $user->associate(Role::findOrFail($validate_data['role']));
    $user->save();
    

    【讨论】:

      【解决方案2】:

      我之前也有这个错误,我相信这可能是因为你忘记在User.php模型中的$fillable变量中添加role_id

      【讨论】:

        猜你喜欢
        • 2021-03-01
        • 2017-04-16
        • 2017-05-17
        • 1970-01-01
        • 2015-05-25
        • 2021-08-21
        • 2018-06-15
        • 2020-04-14
        • 2018-09-27
        相关资源
        最近更新 更多