完整性约束违规:1452无法在Laravel 5.2

时间:2016-04-20 06:04:14

标签: php mysql sql-server laravel laravel-5.2

当我尝试插入role时出现错误。我在 StackOverFlow 中找到了这个问题的解决方案,但所有这些都无法解决我的问题。

我正试图将idroles表格转移到roleID表格的user_roles列。我正在使用 Query Builder Laravel 5.2。

public function store(Request $request)
{
    //
    $role = [];
    $role['role'] = $request->input('role');

    $data= Role::create($role);
    $id= $data->id;
    DB::table('user_roles')->insert([
    'roleID' => $id
    ]);
   //return $data;
    return redirect(route('allRole'));
}

当我插入任何角色时,它会在roles表中插入新数据,但我在roleID表中没有user_roles。我收到错误:

 SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or
 update a child row: a foreign key constraint fails
 (`amarjobs`.`user_roles`, CONSTRAINT `fkuserRolesuserID` FOREIGN KEY
 (`userID`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE
 CASCADE) (SQL: insert into `user_roles` (`roleID`) values (14))

我遇到的问题在哪里?提前致谢。 搜索结果:

1。 First Solution. 2。 Second Solution.

3 个答案:

答案 0 :(得分:1)

您似乎正在尝试仅将roleID插入user_roles表。 但是在你给定的错误中,似乎user_roles TABLE还有userID字段是什么是外键并且与usersid)表连接。

由于user_roles是一个数据透视表,它同时包含roleIDuserID,并且都是外键。因此,在仅使用roleID值进行插入时,它会尝试插入具有NULL值的userIDuser不匹配的表,这就是为什么完整性约束违反的ID。

因此,以正确的方式插入数据,您必须提供有效的userID

$id= $data->id;
DB::table('user_roles')->insert([
'roleID' => $id,
'userID' => $EXISTING_USER_ID 
]);

我想,它会解决你的问题。

答案 1 :(得分:1)

您可以看到user_roles表格需要userID列&在插入产生错误的内容时,你没有通过字段。

DB::table('user_roles')->insert([
    'roleID' => $id,
    'userID' => $userId, //pass your userID here
]);

另外,我想提一下你在camel case中命名你的数据库表列名称的一些事情,这很糟糕你应该使用下划线&因为db sqls通常不区分大小写,因此使用userID等同于userid

您还在使用DB::insert它不会插入任何created_atupdated_at字段或其他雄辩的功能,因此我建议您使用eloquent model&使用关系是laravel&的美丽雄辩的活跃记录

试试这个

public function store(Request $request)
{
    //
    $role = [];
    $role['role'] = $request->input('role');

    $data= Role::create($role);
    $userdata = User::all();
    $user_id = $userdata->first()->id;
    $id= $data->id;
    DB::table('permissions')->insert([
    'role_id' => $id
    ]);
    DB::table('user_roles')->insert([
    'roleID' => $id,
    'userID' => $user_id
    ]);
   //return $data;
    return redirect(route('allRole'));
}

这里$userdata = User::all();你选择所有用户你想让你所有人都拥有这个角色然后你必须在它上面循环播放它。插入它。或者,如果您希望第一个用户拥有此角色,那就没关系。

另外,我建议您应该阅读更多Laravels文档以清除内容。

答案 2 :(得分:0)

在上面的错误中,您错过了userID字段,这在关系视角中是必须的。因此,您应该通过userID,然后您的代码将正常运行。

$role = [];
$role['role'] = $request->input('role');

$data= Role::create($role);
$id= $data->id;
DB::table('user_roles')->insert([
'roleID' => $id,
'userID'=>1, // pass userID with whom you wan to attach new roleID
]);

return redirect(route('allRole'));

这是使用关系方法的高级版本

在相应的模型中添加这些方法

用户模型

public function userRoles(){
    return $this->belongsToMany('App\Role','user_roles','userID','roleID');

}

榜样

public function roleUsers(){
    return $this->belongsToMany('App\User','user_roles','roleID', 'userID');

}

并执行此操作以插入角色。

$user = App\User::find(1);    
$user->roles()->attach($roleId);

$role = [];
$role['role'] = $request->input('role');

$data= Role::create($role);
$id= $data->id;

$user->userRoles()->attach(['
  'roleID' => $id,
  'userID'=>$user->id
']);

return redirect(route('allRole'));