Laravel 批量分配插入新记录 create() 替代方法?

Laravel mass-assignment insert new record create() alternative?

我有一个 'users' table 和 'activation_tokens' table。我在用户模型中有一个关系 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 应该自动处理它,就像文档似乎宣传的那样。所以我觉得我做错了什么?

我不知道如何正确地做到这一点。有什么提示吗?

谢谢!

可能更正统一些:

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

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

所以,在网上搜索了很多之后,我发现我可以暂时停止批量分配限制。

    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- unguard 行一旦执行:

ActivationToken::unguard();

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

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

感谢大家的回复!