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