2014年の非常に古い情報となります。
現行のLaravelではまた別の方法があるかもしれませんので、ご注意ください。
Laravelでタイトルのことをやろうとする時、皆さんどうしてますか?
今まで僕は以下の様なやり方をしていました。
良い方法が見つからなかったので今までこの方法で通してきましたが、もっとベストな方法がありました。
すごいスッキリしました!
これどういうことかと言うと、firstOrNewで条件に合致したものがあればfirst()で取得し、
なければnewでインスタンス生成して返してくれることを使い、後の更新処理がinsertかupdateかに依らないようにしているのです。
やはりちゃんと公式の情報は読まないといけませんね・・・反省。
【追記】
TwitterでLaravel答えるマンさんに色々と教えて頂きました!
@syossan27 このケースなら updateOrCreate のほうがいいと思うよー。
— MATSUO Masaru (@localdisk) 2014, 9月 2
@syossan27 あと、firstByAttributes便利やで。
Model::firstByAttributes(['foo' => 'bar]) は
Model::where(['foo' => 'bar'])->first() といっしょやで。
— MATSUO Masaru (@localdisk) 2014, 9月 2
教えていただいたことを元に先ほどのコードを書き換えてみます!
Laravelの中身を見れば分かりますが、この書き方はfillを使うためモデルでfillableすることを忘れないで下さい。
参考:
Laravel4のEloquent ORMではまった件 - 終電23時15分って早くね?
また元の書き方もこんな風に書き換えられます。
ふぅーむ・・・色々と便利なものがありますな・・・
@localdiskさんありがとうございます!
【追記の追記】
@syossan27 もうちょっとだけ補足させてください。findやfirstの1件だけの検索で見つからない場合は null が戻るので is_null のチェックがいいよ。getみたく複数件の場合は(つづく)
— MATSUO Masaru (@localdisk) 2014, 9月 2
@syossan27 (つづき)Illuminate\Database\Eloquent\Collectionを戻す。なので
$m = Model::where(['foo' => 'bar']->get(); if ($m->count === 0)
(つづく)
— MATSUO Masaru (@localdisk) 2014, 9月 2
@syossan27 (つづき)とすると(あぁ、結果が0件なんだな)とわかりやすい。Laravelはこのへんを非常に大事にしてる感じあります。以上補足おしまい。
— MATSUO Masaru (@localdisk) 2014, 9月 2
というアドバイス頂きましたので、これを参考にさせていただくと
は
とした方が良いみたいです!