5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel】wasRecentlyCreatedはいつTRUEを返すのか

Last updated at Posted at 2020-08-21

Modelのメンバ変数であるwasRecentlyCreated。
名前の通りのものなのですが,私の想像とは違う動き方をしたので,メモとして残しておきます。
おそらく一緒に使うことが多いのはfirstOrNew()であったり,firstOrCreate()だと思うので,併せてそちらについても記載しています。

##使い方
Userモデルを操作すると仮定します。
###firstOrCreate()
そのまま。
userをnameに与えた文字列で検索し,見つかればおしまい。
見つからなければ新しく作成(User::create)までやってあげますよ,というメソッド。

user.php
// nameでUserを取得する。存在しなければ作成(create)まで行う
$user = User::firstOrCreate(['name' => 'hoge']);

// nameでUserを取得する。存在しなければ指定されたname,emailを含め作成(create)まで行う
$user = User::firstOrCreate(['name' => 'hoge'], ['email' = 'fuga@example.com']);

echo $user->id;
// createまで行っているので,先ほど作成したidの情報なども吐いてくれる

###firstOrNew()
ちょっと中途半端な子。
userをnameに与えた文字列で検索し,見つかればおしまい。
もし見つからなければインスタンス化までやりますね,というメソッド。

user.php
// nameでUserを取得する。存在しなければインスタンス化まで行う。createはしない。
$user = User::firstOrNew(['name' => 'hoge']);

// nameでUserを取得する。存在しなければ指定されたname,emailを含めインスタンス化まで行う。こちらも同様,createはしない。
$user = User::firstOrNew(['name' => 'hoge'], ['email' = 'fuga@example.com']);

echo $user->id;
// インスタンス化までしかしていないので,idはnullで返ってくる

###wasRecentlyCreated
問題はこの子だった。
文字通り,先程Createされているかどうかを返してくれる。
それがどうも自分の中でピンときていなかった。
実際の動きを書いてみます。

user.php
$user = User::firstOrCreate(['name' => 'hoge']);
echo $user->wasRecentlyCreated;
// TRUE。先ほどCreateまで行っているので。

$user = User::firstOrNew(['name' => 'hoge']);
echo $user->wasRecentlyCreated;
// FALSE。先ほどCreateはしていないので。

私はインスタンス化まで済んでいればTRUEが返ってくると思って処理を書いていたのですが,どうもうまく動かない。
これは多分やらかしてるな…と思った結果がこれでした。
名前の通りなのですが,ここまで詳しく書かれているのを見つけることができなかったので,私の備忘録として書き留めておきます。

5
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?