2016-05-15 44 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相比,優勢是什麼? ? 同時,我發現我認爲更好的解決方案。我會更新我的帖子。 –