2016-04-29 12 views
0

新しいユーザーにFirstOrCreateを使いたいです。そのようなFirstOrCreateのパスワード

$user = User::FirstOrCreate([ 
     'name' => $request->username, 
     'email' => $request->email, 
     'password' => User::generatePassword() 
    ]); 

のGeneratePassword()単にランダムな8文字の文字列の文字列を生成します。

このパスワードの値を持つユーザーを探しているため、動作しません。

このメールにはユーザーがいないときに機能しますが、そのときに制約エラーが発生します。

これを修正する最もクリーンな方法は何ですか?

+0

なぜあなたは検索中に 'password'フィールドを使用しますか?ユーザーは電子メールとユーザー名で検索できる必要があります。 – nextt1

答えて

1

文法上の誤りがあります。 ::firstOrCreateは提供された基準に基づいて検索し、見つからなければデータベースエントリを作成し、そのデータを含むモデルを返します。 ::firstOrNewはありませんを使わないで自動的にモデルを保存します。

だから、これが必要です。我々は、パスワードのfoobar123が存在して使用して[email protected]とジョシュかどうかをチェックされていないため、

$user = User::firstOrNew([ 
    'email' => $request->email, 
]); 

我々はnamepasswordが含まれていない、私たちは[email protected]がアカウントを持っているかどうかを知りたいです。

コントローラのロジックがちょっと変わっていると思われるのは、最初にの情報を確認してからのモデルを作成する前に、私はそれをロールバックします。

$user = User::firstOrNew([ 
    'email' => $request->email, 
]); 

// This model does not have a DB record. 
if (!$user->exists) 
{ 
    $user->name = $request->username; 
    $user->password = User::generatePassword(); 
    $user->save(); 
} 

return $user; 

この論理を使用すると、電子メールに基づいてレコードが見つかります。レコードが存在すれば、それを渡します。そうでない場合は、レコードを作成して渡す前に、ユーザー名を割り当ててパスワードを生成します。

関連する問題