目的
- laravelのEloquentの
updateOrCreate()
メソッドを使ってみたら非常に使いやすかったので簡単にまとめる
updateOrCreate()
メソッドって??
-
公式ドキュメントだと下記に記載されている。
-
当該のモデルに紐づくテーブルを探索してくれて、指定した値が指定したカラムに格納されているレコードがヒットすればupdate、ヒットしなかった場合はcreateを実行する。
-
このメソッド一個でsaveまで行ってくれる。
使用方法
-
下記のように記載する。
updateOrCreate(['探索カラム名' => 条件となる値], ['値を格納するカラム名' => 値],);
-
例えばhogeテーブルが存在したとする。
-
id
カラムが4のレコードを探索してレコードが- 存在していた場合、
name
カラムに「name_string」を格納してupdateを行う。 - 存在していなかった場合、
name
カラムに「name_string」を格納してcreate(新しいレコードの作成)を行う。
- 存在していた場合、
-
-
上記の処理を
updateOrCreate()
メソッドで記載する場合、下記の様に記載する。(Hogeモデルクラスはすでにuse宣言されているものとする。)Hoge::updateOrCreate(['id' => 4], ['name' => 'name_string'],);
-
エラー
Add [カラム名] to fillable property to allow mass assignment on [モデル名]
が出る場合は下記の記事をご確認いただきたい。- laravel 「Add [カラム名] to fillable property to allow mass assignment on [モデル名]」エラーの解決
- どうやらMass Assignmentというものが安全のためにブロックしたようで、
updateOrCreate()
メソッドを使って更新するカラムをホワイトリストに登録して上げる必要があるらしい。
- laravel 「Add [カラム名] to fillable property to allow mass assignment on [モデル名]」エラーの解決
具体的な使用例(かなり不親切な記載ですすみません。)
-
※依存注入とかをしている(
__construct()
メソッドとかに色々書いてる)ので若干分かりにくいかもしれません。わからなかったらスルーでOK -
下記は本当に一部分の処理のみ記載する。詳細は下記のリンク先のGithubのリポジトリを参照いただきたい。
-
下記のようなスキーマのcontentsテーブルがあったとする。
+--------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+------------------+------+-----+---------+----------------+ | id | bigint unsigned | NO | PRI | NULL | auto_increment | | content | text | NO | | NULL | | | deleted_flag | tinyint unsigned | NO | | 0 | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +--------------+------------------+------+-----+---------+----------------+
-
contentsテーブルのidの値を探索して
- ヒットしたら当該レコードのcontentsの内容を更新(update)する。
- ヒットしなかったらcontentsにpostされた値を格納してレコードを作成(create)する。
public function save($post_data) { return $this->content->updateOrCreate( ['id' => $post_data->id], ['content' => $post_data->content], ); }