【问题标题】:Integrity constraint violation: 1452 Cannot add or update a child row in Laravel 5.2完整性约束违规:1452 无法在 Laravel 5.2 中添加或更新子行
【发布时间】:2016-08-12 14:49:01
【问题描述】:

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

我正在尝试从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))

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

1. First Solution. 2. Second Solution.

【问题讨论】:

  • 您是否要为 User 分配角色?你用的是什么包?
  • 我没有使用任何包。我正在尝试制作 acl(访问控制列表)。是的,现在我正在尝试为用户扮演角色。
  • 您能提到您的用户、角色数据库结构和模型关系吗?所以我可以相应地指导你
  • @ChoncholMahmud user_roles 表的数据库结构是什么?我猜它有一个user_id 列并且它有一些外键约束&这里你没有传递任何user_idDB::table('user_roles')->insert([ 'roleID' => $id ]);
  • @Qazi 这里是关系视图prntscr.com/auhcxc

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


【解决方案1】:

在您的上述错误中,您缺少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'));

【讨论】:

  • 当我尝试添加角色时,我收到错误消息Call to a member function roles() on a non-object。我在 RoleController 中放置了底部代码。
  • 注释掉或删除此行$user->roles()->attach($roleId);
  • 现在它显示Class 'App\Http\Controllers\App\User' not found。为什么要使用App\User?在附加(['roleID' => $id,'userID'=>$user->id ]);这将是您忘记删除 [] 之间的单引号
  • App\User 是您的 User 模型。您是否在用户和角色模型中添加了上述方法?
  • 是的,我在角色模型中添加了use App/User;。但我认为,它将是$user = User::find(1);,对吗?
【解决方案2】:

您似乎试图仅将 roleID 插入到 user_roles 表中。 但在您给定的错误中,user_roles TABLE 似乎也有 userID 字段什么是外键并与 users (id) 表连接。

因为user_roles 是一个数据透视表,它同时具有roleIDuserID,并且都是外键。因此,在仅使用 roleID 值插入时,它会尝试使用与 user 不匹配的 NULL 值插入 userID 表中的任何 ID,这就是违反完整性约束的原因。

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

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

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

【讨论】:

  • pastebin.com/03hdQEL6 ,以这种方式我试图得到但我得到一个错误`RoleController.php第50行中的ErrorException:未定义的属性:Illuminate\Database\Eloquent\Collection::$id`
  • 我想,你完全理解我的观点。但是我怎么能得到$EXISTING_USER_ID。我已经尝试过第一种评论方式。请看一下。
  • 我看到了你的 pastebin 代码。你把所有用户带到$userdata = User::all(); $user_id = $userdata->id; // 这行应该给出错误。 // 您只需要获取一个特定用户并获取其id 属性。像$userdata = User::all()->first(); $user_id = $userdata->id; 然后尝试将数据插入user_roles 表。我的意思是通过$EXISTING_USER_IDusers 表中存在的任何用户ID。
【解决方案3】:

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

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

另外我想提一下你用驼峰式命名你的数据库表列名的一些事情,这是不好的,你应该使用下划线&因为 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 文档以清除问题。

【讨论】:

  • pastebin.com/03hdQEL6,以这种方式我试图获取但我得到一个错误`RoleController.php第50行中的ErrorException:未定义的属性:Illuminate\Database\Eloquent\Collection::$id`
猜你喜欢
  • 2016-10-27
  • 1970-01-01
  • 2023-03-23
  • 2017-04-26
  • 2016-05-31
  • 2020-01-23
  • 2020-08-13
  • 1970-01-01
相关资源
最近更新 更多