はじめに
今回の記事では、PHPのフレームワークであるLaravelでのDB操作に関する基礎知識を紹介します。Laravelの基礎知識に関してはこちらをご覧ください。
Eloquent
EloquentはLaravelの標準のORMです。DB上のデータの検索、作成、更新はもちろん、リレーション、論理削除なども簡単に扱うことができます。
それでは、実際にEloquentの使い方を見ていきましょう。
モデルの定義
モデルは artisan make:model コマンドで作成することができます。Bookモデルの作成は以下のようになります。
1 | $ php artisan make:model Book |
上記のコマンドを実行すると、 app ディレクトリの直下に Book.php が作成されます。
また、まだマイグレーションファイルを作成していなければ、モデルの作成時にマイグレーションファイルを一緒に作成することができます。マイグレーションに関しては次に説明します。
1 | $ php artisan make:model Book -m |
通常、モデルは app 直下に作成されますが、オートロードするように指定してある場所ならどこに作成してもよいです。例えば、 app/Models 直下に作成したい場合は以下のようにします。
1 | $ php artisan make:model 'App\Models' |
モデルの取得
DBからレコードを1件取得するには find メソッドを使用します。以下のように使用します。
1 2 | // idが1のレコードを取得する $book = App\Book::find(1); |
複数のレコードを取得するには all メソッドを使用します。以下のように使用します。
1 | $books = App\Book::all(); |
whereなど、条件をつけてレコードを取得したい場合は where メソッドを使用します。以下のように使用します。
1 2 | // IDが10より大きいレコードをすべて取得する $boosk = App\Book::where('id', '>', 10)->get(); |
whereRaw メソッドを使用すると任意のSQLを実行することができます。以下のように使用します。
1 2 | // IDが10より大きいレコードをすべて取得する $boosk = App\Book::whereRaw('id > ?', [10])->get(); |
モデルの追加
レコードを1件追加するには2種類の方法があります。1つ目はインスタンスを生成してから save メソッドを使用する方法です。以下のように使用します。
1 2 | $book = new App\Book(); $book->save(); |
2つ目は create メソッドを使用する方法です。この方法では事前にモデルに fillable プロパティで変更を許可するパラメータを列挙しておく必要があります。以下のように指定します。
1 2 3 4 5 6 7 8 9 10 | <php namespace App; use Illuminate\Database\Eloquent\Model; class Book extends Model { protected $fillable = ['title', 'price']; } |
以下のように使用します。
1 | $book = App\Book::create(['title' => 'hoge', 'price' => 100]); |
複数のレコードを一度に追加するには insert メソッドを使用します。注意点としては、insert では先程説明した fillable がきかないので、意図しない値が入る場合があります。以下のように使用します。
1 | App\Book::insert([['title' => 'hoge', 'price' => 100], ['title' => 'fuga', price => 120]]); |
モデルの更新
レコードの更新には2種類の方法があります。1つ目はインスタンスを取得してから save メソッドを使用する方法です。以下のように使用します。
1 2 3 | $book = App\Book::find(1); $book->title = 'hogehoge'; $book->save(); |
2つ目は update メソッドを使用する方法です。この方法では create メソッドと同様に fillable プロパティで変更を許可するパラメータを列挙しておく必要があります。以下のように使用します。
1 | $book = App\Book::where('id', '=', 1)->update(['title' => 'hogehoge']); |
モデルの削除
レコードの削除には destroy メソッドを使用します。以下のように使用します。
1 2 | // IDが1と2のレコードを削除する App\Book::destroy([1,2]); |
クエリスコープ
クエリスコープを定義することで、検索条件を使い回す事ができます。以下のように定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <php namespace App; use Illuminate\Database\Eloquent\Model; class Book extends Model { public function scopeExpensive($query) { return $query->where('price', '>' 9999); } public function scopeTitleLike($query, $title) { return $query->whereRaw('title like ?', ['%'.$title.'%']); } } |
以下のように使用します。
1 2 | $expensiveBooks = App\Book::expensive()->get(); $anyHogeBooks = App\Book::titleLike('hoge')->get(); |
マイグレーション
マイグレーションファイルを作成し、実行することでデータベースを定義します。
それでは、実際にbooksテーブルを定義してみましょう。
マイグレーションファイルの作成
マイグレーションファイルの作成は artisan make:migration コマンドで行います。
1 | $ php artisan make:migration create_books_table |
上記のコードを実行すると database/migrations ディレクトリの直下に CreateBooksTable.php が作成されます。
作成直後のマイグレーションファイルは、カラムが1つも定義されていないので、 title カラムと price カラムを追加します。以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateBooksTable extends Migration { public function up() { Schema::create('books', function (Blueprint $table) { $table->increments('id'); $table->string('title', 255); $table->unsignedSmallInteger('price')->default(100); $table->timestamps(); }); } public function down() { Schema::drop('books'); } } |
up メソッドには追加したい定義を記述します。逆に down メソッドには元に戻すための処理を記述します。
マイグレーションの実行
マイグレーションは artisan migrate コマンドで行います。以下のようになります。
1 | $ php artisan migrate |
上記のコマンドを実行すると、まだ実行されていないすべてのマイグレーションファイルの up メソッドが実行されます。
ロールバック
追加したマイグレーションの定義を戻したい場合には artisan migrate:rollback コマンドを実行します。以下のようになります。
1 | $ php artisan migrate:rollback |
上記のコマンドを実行すると、直前に実行したマイグレーションファイルの down メソッドが実行されます。
初期状態に戻す
これまでに実行したマイグレーションをすべてもとに戻したい場合は artisan migrate:reset コマンドを実行します。以下のようになります。
1 | $ php artisan migrate:rollback |
さいごに
LaravelでのDB操作の基礎として、Eloquentの使い方とマイグレーションのやりかたを紹介しました。