Laravel mass-assignment插入新记录create()替代?

时间:2016-05-15 13:36:24

标签: laravel eloquent mass-assignment

我有'用户'表和'activation_tokens'表。我在User模型中有一个关系为hasOne(ActivationToken :: class);

这一切都很好。现在我想在创建用户时创建一个令牌。所以我打电话给

$user->ActivationToken()->create(array('token'=>'RANDOM_STRING")); 

这一切都很好,但我遇到了质量分配错误。我想要将'token'设置为可填充。

相反,我尝试

    $activationToken = new ActivationToken();
    $activationToken->token = 'RANDOM_STRING";
    $activationToken->save();

哪个好,但它没有在查询中设置user_id字段。我想我可以通过设置$activationToken->user_id = $user->id;手动完成它但是这感觉不对,因为ORM应该自动处理这个文档似乎做广告。所以我觉得我做错了什么?

我无法弄清楚如何正确地做到这一点。任何提示?

谢谢!

2 个答案:

答案 0 :(得分:1)

也许更多的是orm-ish:

...
$activationToken->user()->associate($user);
$activationToken->save();

$activationToken->user()是指向User模型的关系的名称。请注意()

答案 1 :(得分:0)

因此,在搜索网页后,我发现我可以暂时停止批量分配限制。

    ActivationToken::unguard();
    $user->ActivationToken()->create(array('token'=>str_random(100)));
    ActivationToken::reguard();

所以这似乎工作正常。此外,jsphpl的反应非常好,下面的解决方案也很好。

    $activationToken = new ActivationToken();
    $activationToken->token = str_random(100);
    $activationToken->user()->associate($user);
    $activationToken->save();

当然还有一些问题。

1-为什么

$activationToken->user()->associate($user);

优于

$activationToken->user_id = $user->id;

2-执行了无人防守行:

ActivationToken::unguard();

在另一个PHP进程调用reguard()之前,是否有任何方法可以滥用该表?注意:我猜它只影响运行过程,所以在我的情况下它应该是安全的......或者

无论如何,这些都超出了原始问题的范围,所以......

感谢所有回复!