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

Posted

技术标签:

【中文标题】如何获取已存储在另一个模型中的名称 ID,并使用名称 ID 在 laravel 的数据透视表数据库中存储值?【英文标题】: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? 【发布时间】:2021-09-13 06:00:35 【问题描述】:

我遇到了一个错误。 所以错误就像,我有三个表 users、roles 和 users_roles 表,而 users_roles 是两者之间的数据透视表。该角色包含 Admin、User 和 editor 。 现在所有用户都已创建,角色已创建。 现在对于 users_roles 表: 我对 user_roles 表的迁移如下:

      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');
        
    );

现在事情就是这样。我必须在我的所有用户都存在的表(在浏览器上)中为每个用户分配一个角色,它们包括添加分配角色按钮,该按钮重定向以向用户添加角色 他们是表单,它可以为用户选择角色并检索角色,我从角色模型中获取并在那里显示它。 刀片文件是这样的:

          @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 代表 admin ,2 代表 user ,3 代表 editor 。 现在的主要问题是,如果用户选择用户,那么它的 id 为 2,这是在角色模型中分配的。 现在如何将 user(role) 的 id 保存到 RoleUser 模型中,因为在这里我们将获取该角色的名称.. 如何链接两个表并将两个 id 存储在 role_user 中--

这里是role_user方法的store函数:

 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,它是数据透视表 (role_user) 的控制器??? 什么将存储在 role_id 列中以及如何做到这一点???

【问题讨论】:

【参考方案1】:

首先,您在命名表格时可能应该遵循框架的约定,因此数据透视表应该命名为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);
    

注意:如果您不重命名数据透视表,则必须提供带有数据透视表名称的第二个参数,eq:

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

最后,在您的控制器(存储方法)中,您应该执行以下操作:

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

这里还有一点需要注意: 如果您一次只需要您的用户拥有一个角色(根据您的单选按钮示例),那么您的关系可能甚至不应该首先包含数据透视表;您可以将role_id 存储在users 表中。

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

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

【讨论】:

谢谢,我想你只是误解了这个问题。让我更新一下我的问题 嘿那里..我刚刚更新了问题,这个存储方法是 role_user 而不是 user ,那么现在该怎么做??? 而且我只是在前面添加了它们之间的关系,不想问那么久..所以如何从角色模型中获取.. 您提到您有一个RoleUser 模型。这是扩展Illuminate\Database\Eloquent\Relations\Pivot; 类吗?如果这是您想要采取的路径,那也是可能的,但您也应该相应地更改 UserRole 类。对于您的用例来说,这太过分了! 那么最好的方法是什么?我没有使用 Illuminate\Database\Eloquent\Relations\Pivot;在角色用户中

以上是关于如何获取已存储在另一个模型中的名称 ID,并使用名称 ID 在 laravel 的数据透视表数据库中存储值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个插入存储过程期间调用一个插入存储过程并获取其返回的ID?

如何加入名称作为值存储在另一个表中的表?

如何在另一个类中获取一个类对象的 id 并存储在数据库中 - Django

如何使用实体框架中的 DBContext 获取在另一列中具有重复数据的所有 ID?

获取存储在变量中的字符串的值,其名称作为字符串存储在另一个变量中

如何保存和获取存储在共享首选项中的包名称?