如何获取已存储在另一个模型中的名称的 ID,并在 laravel 中的 pivot table 数据库中存储值时使用名称的 ID?

how to fetch the id of name that has been stored in another model and using the id of name in storing values in pivot table database in laravel?

我遇到了一个错误。 所以错误就像,我有三个 tables 用户,角色和 users_roles tables,users_roles 是两者之间的枢轴 table。该角色包含 Admin、User 和 editor 。 现在所有用户都已创建,角色也已创建。 现在 users_roles table: 我对 user_roles table 的迁移是这样的:

      Schema::create('users_roles', function (Blueprint $table) {

        $table->engine = 'InnoDB';
        
        $table->id();
        
        $table->unsignedBigInteger('user_id');
        $table->unsignedBigInteger('role_id');
            
        
        $table->foreign('user_id')->references('id')->on('users');
        $table->foreign('role_id')->references('id')->on('roles');
        
    });

现在就是这样。我必须为每个用户分配一个角色,在我的 table(在浏览器上)我的所有用户都存在,它们由添加分配角色按钮组成,该按钮重定向以向用户添加角色 他们是形式,它可以 select 角色给用户并检索角色,我从角色模型中获取并在那里显示。 blade 文件是这样的:

          @foreach ($Role as $role)
            <div class="form-check form-check-inline">
                <input class="form-check-input" type="radio" name="role" value="{{$role->name}}">
                <label class="form-check-label">{{$role->name}}</label>
            </div>    
          @endforeach

并且每个角色都包含一个附加的 ID,比如 1 代表管理员,2 代表用户,3 代表编辑。 现在的主要问题是,如果用户 select 的用户那么,它的 ID 为 2,这是在角色模型中分配的 .. 现在如何将用户(角色)的 id 保存到 RoleUser 模型中,因为在这里我们将获得该角色的名称.. 如何 link 两个 tables 并将两个 id 存储在 role_user--

这里是role_user方法的存储函数:

 class RoleAssignController extends Controller 
{

     public function store($user_id,Request $request)
{
    $data = $request->all();
    $User_id = $request->route('user_id');
    // dd($User_id);
    
    // dd($data);
    $rules = array(
        'role' => 'required',
    );
    $validate = Validator::make($data,$rules);  
    if ($validate->fails()) {
        return redirect()->back()->withInput()->withErrors($validate);
    }
    else{
   
        $form_data = array(
            'user_id' => $User_id,
            'role_id' => 
        );

        $UserRole = UserRole::create($form_data);
        
        return redirect('/Admin/user')->with('success');
    }       
}

}

这个存储方法是 assignrolecontroller 的,它是 pivot 的控制器 table (role_user) ???
role_id 列中将存储什么以及如何存储???

首先,您在命名 table 时可能应该遵循框架的约定,因此枢轴 table 应该命名为 role_user(单数,按字母顺序排列)

那么你应该确保定义 UserRole 模型之间的 (ManyToMany) 关系。

app\Models\User.php中确保你有这个功能:

    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

app\Models\Role.php中确保你有这个功能:

    public function users()
    {
        return $this->belongsToMany(User::class);
    }

注意:如果您不重命名枢轴 table,则必须提供第二个参数,其中包含枢轴的名称 table,eq:

return $this->belongsToMany(Role::class, 'users_roles');

最后,在你的控制器(store 方法)中你应该做类似的事情:

$user = User::find($user_id);
$roles = $request->input('roles');
$user->roles()->sync($roles); // where roles is the array you get from the request

这里还有一点要注意: 如果您只需要您的用户一次扮演一个角色(根据您使用单选按钮的示例),那么您的关系一开始甚至可能不包含枢轴 table;您可以将 role_id 存储在 users table.

如果您想为具有多个角色的用户设计数据库,则应将单选框更改为复选框,并将输入的名称也从“角色”更改为“角色[]”。

更多信息请查看官方文档:https://laravel.com/docs/8.x/eloquent-relationships#syncing-associations