2016-05-15 64 views
1

我有一个'用户'表和'activation_tokens'表。我在用户模型中与hasOne(ActivationToken :: class)有关系;Laravel mass-assignment插入新记录create()的替代方法?

这一切工作正常。现在我想在创建用户时创建一个令牌。所以我打电话

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

这是一切都好,但我打的质量分配错误。我不要想要设置'令牌'作为可填写。

相反,我尝试

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

这是确定,但它不设置查询user_ID的领域。我想我可以手动设置$activationToken->user_id = $user->id;但是这种感觉是错误的,因为ORM应该自动处理这个,只要文档看起来像广告一样。所以我觉得我做错了什么?

我想不出如何正确地做到这一点。任何提示?

谢谢!

+0

如果你想去_ORM way_,那么你需要在你的'可填充的'数组中设置令牌来进行批量分配。否则,您需要使用不首选的方法'$ activationToken-> user_id = $ user-> id'手动设置它。两种方法你可以去。你为什么不想将字段设置为“可填充”? – codedge

+0

如果我必须将可填充的所有东西都设置为可以使用ORM方式,那么它是否会破坏可填充/防护的目的?除非整个质量分配是一个有缺陷的概念?无论如何,谁会将随机http请求中的所有值分配给数据库查询。 :) 只需在参数user_id并插入令牌的ActivationToken类中创建一个函数就不会更简洁吗?然后我可以调用ActivationToken :: inserToken($ user-> id)并完成它。 –

+0

@codedge请参阅我发布的答案。似乎有一种方法可以使用批量分配来更新表格,而无需向可填写的列添加列。 –

回答

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

ActivationToken::unguard(); 

还有什么办法,该表可前被滥用reguard()被另一个PHP进程调用?注:我猜测它会影响正在运行的进程只有这么在我的情况下,它应该是安全的也许......

无论如何,这些都是原来的问题等等的范围之外......

感谢所有回应!

1

也许更多的ORM-ISH:

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

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

+0

我在ActivationToken模型中拥有用户()与belongsTo的关系 但是我认为attach()可能不适用于hasOne()和belongsTo()?我得到错误:“调用未定义的方法Illuminate \ Database \ Query \ Builder :: attach()”,我的IDE在\ Illuminate \ Database \ Eloquent \ Relations \ BelongsTo中找不到“Method'attach' –

+0

你是对的,应该是'associate($ user)',然后,而不是'attach'。你可以试试吗? – jsphpl

+0

是的,员工这样做。但我不明白与$ activationToken-> user_id = $ user-> id相比,优势是什么? ? 同时,我发现我认为更好的解决方案。我会更新我的帖子。 –