模型ID在Laravel事务中显示为0

时间:2017-01-12 16:56:25

标签: laravel transactions

我正在修改Laravel 5.3 RegisterController中的原始方法:

protected function create(array $data) {
    DB::beginTransaction();
    $user = User::create([
                'id' => $this->generateID(),
                'email' => $data['email'],
                'password' => bcrypt($data['password']),
                'active' => 1
    ]);

    if (!$user) {
        DB::rollback();
    }
    DB::commit();

    return $user;

}

如果我在内部(或外部)交易中检查dd($user),我会获得id=0

只有当我提交事务时,生成的ID才会保存到DB中,应该是。

我错过了什么?为什么ID在方法中显示为0,但在DB中显示为生成ID?

我想在:

中使用$ user-id
$profile = Profile::create([
        'id' => $user->id,
        'name' => $data['name'],
    ]);

在同一交易中。

2 个答案:

答案 0 :(得分:0)

您的错误可能是由于批量分配造成的,请确保您已将相应字段列入白名单:

class User extends Model {
    protected $fillable = ['id', 'email', 'password', 'active'];
}

此外,最好使用闭包和try/catch来更好地处理错误:

try {
    DB::transaction(function() use($data) {
        $user = User::create([
            'id' => $this->generateID(),
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
            'active' => 1
        ]);

        Profile::create([
            'id' => $user->id,
            'name' => $data['name']
        ]);    
    });

    DB::commit();
catch (\Exception $e) {
    DB::rollback();
    //do something with $e->getMessage();
}

这可以解决您的问题。

答案 1 :(得分:0)

您不应该手动生成ID。我刚刚在一次交易中对它进行了测试,它确实有效:

$user = User::create([
    'email' => $data['email'],
    'password' => bcrypt($data['password']),
    'active' => 1
]);

dd($user->id);