2016-05-15 25 views
1

私は 'users'テーブルと 'activation_tokens'テーブルを持っています。私は、ユーザーモデルでhasOne(ActivationToken :: class)という関係を持っています。Laravel大量割り当て挿入新しいレコードcreate()代替?

これはすべて問題なく動作しています。今私は、ユーザーを作成するときにトークンを作成したいと思います。だから私は

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

を呼び出すこれはすべての良いですが、私は大量の割り当てエラーを打っています。 I do not 'token'を塗りつぶしに設定したい。

代わりに、私は大丈夫ですが、それは、クエリでのuser_idフィールドを設定しません

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

を試してみてください。私は手動で設定することでそれを行うことができると思います$activationToken->user_id = $user->id; ORMはドキュメントが広告するように見える限り、これを自動的に処理する必要があるので、これは間違っています。だから私は何か間違っていると思う?

これを正しく行う方法を理解できませんでした。何かヒント?

ありがとうございます!

+0

_ORM way_に移動する場合は、一括割り当てのためにトークンを 'fillable'配列に設定する必要があります。それ以外の場合は、 '$ activationToken-> user_id = $ user-> id'の方法で手動で設定する必要があります。あなたが行くことができる2つの方法。なぜフィールドを 'fillable'に設定したいのですか? – codedge

+0

ORMを使用できるようにすべてをfillableに設定しなければならない場合は、fillable/guardedの目的を無効にしませんか?この全質量割り当てに欠陥のある概念がないかぎり?とにかく誰がランダムなhttpリクエストからすべての値をデータベースクエリに割り当てるか。 :) 引数user_idを取り、トークンを挿入するActivationTokenクラスで関数を作成するほうがクリーンではないでしょうか?それから、ActivationToken :: inserToken($ user-> id)を呼び出すだけで済みます。 –

+0

@codedge私が投稿した回答をご覧ください。列をfillableに追加することなく、表を一括割り当てで更新する方法があるようです。 –

答えて

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(); 

もちろん、いくつかの質問が残っています。 unguard行が実行されると

1-なぜ

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

2 - より

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

優れている:

ActivationToken::unguard(); 

は、テーブルの前に悪用されることをどのような方法がありますreguard()は別のPHPプロセスによって呼び出されますか?注:私は、私の場合、おそらく...

はとにかく、これらは非常に元の質問の範囲外である安全でなければならないだけので、それが実行中のプロセスに影響を与える推測しています...すべてのための

感謝をレスポンス!

1

たぶんもう少しORMっぽい:

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

$activationToken->user()は、Userモデルを指しているリレーションの名前です。 ()に注意してください!

+0

ActivTokenモデルのbelongsToとuser()の関係があります しかし、私はattach()がhasOne()とbelongsTo()でうまく動作しないと思いますか?私はエラーが発生しました: "定義されていないメソッドを呼び出して\ Database \ Query \ Builder :: attach()"を呼び出すとIDEに "メソッド 'attach'が\ Illuminate \ Database \ Eloquent \ Relations \ BelongsToに見つかりません" –

+0

'attach 'の代わりに' associate($ user) 'でなければなりません。それを試すことができますか? – jsphpl

+0

はい、関連付けます。しかし、私は$ activationToken-> user_id = $ user-> idと比較して何が利点になるのかかなり分かりません。 ? 一方、私はもっと良い解決策を見つけました。私は私のポストを更新します。 –

関連する問題