mysql 1452 Cannot add or update a child row in Laravel 5.2无法在Laravel 5.2中添加或更新子行

7eumitmz  于 12个月前  发布在  Mysql
关注(0)|答案(3)|浏览(112)

当我尝试插入一个role时,我得到一个错误。我已经找到了这个问题的一些解决方案,但它们不能解决我的问题:

我试图从roles表中获取iduser_roles表的roleID列。这里我使用Laravel 5.2的Query Builder。

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表中插入新数据,但我在user_roles表中没有得到roleID。我得到一个错误:

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


我做的问题在哪里?

pengsaosao

pengsaosao1#

正如您所看到的,您的user_roles表需要userID列&您在插入时没有传递该字段,这就是产生错误的原因。

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

字符串
另外,我想提一下你用 Camel 大小写命名你的DB表列名的几件事,这是不好的,你应该使用下划线,因为数据库SQL通常不区分大小写,所以使用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文档来弄清楚。

n3h0vuf2

n3h0vuf22#

似乎你试图只插入roleIDuser_roles表。但在你给出的错误中,似乎user_roles表也有userID字段,这是外键,并与usersid)表连接。
由于user_roles是一个pivot表,它有roleIDuserID,并且都是外键。因此,当只插入roleID值时,它试图插入具有NULL值的userID,该值与user表的任何ID都不匹配,这就是违反完整性约束的原因。
因此,以正确的方式插入数据将是,您还必须提供VALID userID

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

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

jfewjypa

jfewjypa3#

在你上面的错误,你是失踪的userID字段,这是必须在关系的Angular .所以你应该通过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'));

相关问题