Laravel で生 SQL を実行
はじめに
Laravel で生 SQL を実行する方法。
TL;DR
DB::statement
を使うDB::statement('UPDATE `my_table` SET `a` = `b`')
目次
環境・条件
1 | $ cat /etc/os-release |
詳細
前提(やりたいこと)
マイグレーションでカラムを追加することになったが、既存レコードの初期値として同じテーブルに存在する別カラムの値を設定したかった。
- 予約テーブル(
reservations
)が存在 - 既存カラムとして 利用者ID(
user_id
) がある - 新規カラムとして 予約者ID(
registerer_id
) を追加 (代理予約を可能にしたいイメージ) - マイグレーション直後は
registerer_id = user_id
としたい
結論(生 SQL を実行する方法)
参考: How to do update query on laravel fluent using db::raw - Stack Overflow
SQL で書くと以下。
1 | UPDATE `reservations` SET `registerer_id` = `user_id`; |
これ(SQL)をそのまま実行するには DB::statement
を使う。
1 | public function up() |
その他の方法
その他の(やりたいことを実現する)方法は、普通にループ回す感じだと思う。(自分も最初はこっち考えてた)
1 | public function up() |
ただ、これだと「クエリ数 = レコード数」になるので、レコードが多い場合に時間がかかったり、何らかの問題を引き起こしたりしかねないので微妙。
まとめ
DB::statement
を使うDB::statement('UPDATE `my_table` SET `a` = `b`')
参考文献
- SQLクエリの実行 - データベース - 5.8 Laravel
- How to do update query on laravel fluent using db::raw - Stack Overflow
関連記事
- Laravel で現在の URL 取得方法まとめ
- Laravel で Cookie を使う(参照/設定/削除)
- Laravel で PDF ファイルをブラウザで開く
- Laravel で withCount と having を使って絞り込み
- Laravel で「開始日時 < 終了日時」であることをバリデーションする
- Laravel で有効期限付きの一次的な URL を生成してメールで送信する
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア