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?注意:我猜它只会影响 运行 过程,所以在我的情况下它应该是安全的......
无论如何,这些都超出了原始问题的范围,所以...
感谢大家的回复!
我有一个 '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?注意:我猜它只会影响 运行 过程,所以在我的情况下它应该是安全的......
无论如何,这些都超出了原始问题的范围,所以...
感谢大家的回复!