8
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

laravel Eloquent updateOrCreate()メソッドの使用

Last updated at Posted at 2021-11-06

目的

  • 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 [モデル名]が出る場合は下記の記事をご確認いただきたい。

具体的な使用例(かなり不親切な記載ですすみません。)

  • ※依存注入とかをしている(__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],
        );
    }
    
8
11
2

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
8
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?