Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 保存多对多关系时违反Laravel完整性约束_Php_Laravel_Laravel 4 - Fatal编程技术网

Php 保存多对多关系时违反Laravel完整性约束

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

当存储一个新用户,然后同步一些多对多关系时,我得到一个完整性约束错误,因为新创建的用户的ID似乎没有传递给
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验证,现在可以正常工作了。谢谢