はじめに

Laravel で生 SQL を実行する方法。

TL;DR

  • DB::statement を使う
    • DB::statement('UPDATE `my_table` SET `a` = `b`')
この記事が参考になった方
ここここからチャージや購入してくれると嬉しいです(ブログ主へのプレゼントではなく、ご自身へのチャージ)
欲しいもの / Wish list

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. 前提(やりたいこと)
    2. 結論(生 SQL を実行する方法)
    3. その他の方法
  5. まとめ
  6. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 16.04.6 LTS"

$ php -v
PHP 7.3.16-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Mar 20 2020 13:51:21) ( NTS )

$ composer -V
Composer version 1.9.1 2019-11-01 17:20:17

$ composer info laravel/framework
name : laravel/framework
versions : * v5.7.28

詳細

前提(やりたいこと)

マイグレーションでカラムを追加することになったが、既存レコードの初期値として同じテーブルに存在する別カラムの値を設定したかった。

  • 予約テーブル(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
2
3
4
5
6
7
8
9
public function up()
{
Schema::table('reservations', function (Blueprint $table) {
$table->unsignedInteger('registerer_id')->nullable()->after('user_id')->comment('予約実施者 ID');
// 外部キー制約の設定とかは省略
});

DB::statement("UPDATE `reservations` SET `registerer_id` = `user_id`");
}

その他の方法

その他の(やりたいことを実現する)方法は、普通にループ回す感じだと思う。(自分も最初はこっち考えてた)

1
2
3
4
5
6
7
8
9
10
public function up()
{
Schema::table('reservations', function (Blueprint $table) {
$table->unsignedInteger('registerer_id')->nullable()->after('user_id')->comment('予約実施者 ID');
});

Reservation::select('user_id', 'registerer_id')->get()->each(function ($reservation) {
$reservation->update(['registerer_id' => $reservation->user_id]);
});
}

ただ、これだと「クエリ数 = レコード数」になるので、レコードが多い場合に時間がかかったり、何らかの問題を引き起こしたりしかねないので微妙。

まとめ

  • DB::statement を使う
    • DB::statement('UPDATE `my_table` SET `a` = `b`')

参考文献

関連記事

この記事が参考になった方
ここここからチャージや購入してくれると嬉しいです(ブログ主へのプレゼントではなく、ご自身へのチャージ)
欲しいもの / Wish list