Php 保存多对多关系时违反Laravel完整性约束
当存储一个新用户,然后同步一些多对多关系时,我得到一个完整性约束错误,因为新创建的用户的ID似乎没有传递给Php 保存多对多关系时违反Laravel完整性约束,php,laravel,laravel-4,Php,Laravel,Laravel 4,当存储一个新用户,然后同步一些多对多关系时,我得到一个完整性约束错误,因为新创建的用户的ID似乎没有传递给sync()方法。以下是我的存储控制器方法: $user = new User; $user->name = Input::get('name'); $user->username = Input::get('username'); $user->email = Input::get('email'); $user->password = Input::get('pa
sync()
方法。以下是我的存储
控制器方法:
$user = new User;
$user->name = Input::get('name');
$user->username = Input::get('username');
$user->email = Input::get('email');
$user->password = Input::get('password');
$user->save();
// See if roles are passed, if not assign the default role of "view_site"
$roles = Input::has('roles') ? Input::get('roles') : [3];
$user->roles()->sync($roles);
如您所见,我在尝试同步相关数据之前调用了save()
,因此它应该有一个ID。错误如下:
完整性约束冲突:1048列“用户id”不能为空
(SQL:在users\u roles
(role\u id
,user\u id
)值中插入(3,)
如果我在一个已经存在的用户上运行sync方法(user::find($id)->roles()->sync([1,2,3])
),它可以正常工作
以下关系仅供参考:
// User.php
public function roles()
{
return $this->belongsToMany('Role', 'users_roles');
}
// Role.php
public function users()
{
return $this->belongsToMany('User', 'users_roles');
}
编辑:
查询sync()
之前的日志。看起来save()
没有写入数据库
Array
(
[0] => Array
(
[query] => select * from `users` where `id` = ? limit 1
[bindings] => Array
(
[0] => 1
)
[time] => 0.63
)
[1] => Array
(
[query] => select `roles`.*, `users_roles`.`user_id` as `pivot_user_id`, `users_roles`.`role_id` as `pivot_role_id` from `roles` inner join `users_roles` on `roles`.`id` = `users_roles`.`role_id` where `users_roles`.`user_id` = ?
[bindings] => Array
(
[0] => 1
)
[time] => 0.58
)
[2] => Array
(
[query] => select count(*) as aggregate from `users` where `email` = ? or `username` = ?
[bindings] => Array
(
[0] => test@example.com
[1] => example
)
[time] => 0.48
)
)
由于您正在使用,因此验证基于。
在store
方法中,添加if
语句
if($user->save());
$roles = Input::has('roles') ? Input::get('roles') : [3];
$user->roles()->sync($roles);
}else{
return Redirect::back()->withErrors($user->errors());
}
如果不需要检查验证,可以使用
$user->forceSave();
仅用于调试:如果执行
User::find($validId)->roles()->sync($roles)
,您将得到相同的错误?不,这工作正常可能因为您使用的是Ardent
(保存时自动验证),所以当您调用$user->save()时代码>什么也没发生。无论如何,请在末尾添加var\u dump('DB::getQueryLog()')
,并共享我使用的是confide而不是ardant的结果。我将获得查询日志,并在上面发表有意义的文章,因为字段/模型验证由Ardent
提供支持,您有两个选择:重新检查验证,或使用->forceSave()
方法感谢您的建议。这似乎是一个验证错误。在运行验证程序之前,我使用if(validator::make(Input::all(),User::$rules)->passs())
运行验证程序,它看起来是通过的。但是,添加代码时似乎确实存在密码确认不匹配的情况。我在表单中包含了密码确认
输入。我是否需要执行$user->password\u confirmation=input::get('password\u confirmation')
对于Ardent来说太难检查了?似乎您需要添加它。请显示您的$rules
是,我的规则中确实包含密码已确认
。正如你所说的,这个问题非常激烈。已经删除了正常的laravel验证,现在可以正常工作了。谢谢