はじめに
今回の記事では、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=newApp\Book(); $book->save(); |
2つ目は create メソッドを使用する方法です。この方法では事前にモデルに fillable プロパティで変更を許可するパラメータを列挙しておく必要があります。以下のように指定します。
1 2 3 4 5 6 7 8 9 10 | <php namespaceApp; useIlluminate\Database\Eloquent\Model; classBookextendsModel { 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 namespaceApp; useIlluminate\Database\Eloquent\Model; classBookextendsModel { publicfunctionscopeExpensive($query) { return$query->where('price','>'9999); } publicfunctionscopeTitleLike($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 useIlluminate\Support\Facades\Schema; useIlluminate\Database\Schema\Blueprint; useIlluminate\Database\Migrations\Migration; classCreateBooksTableextendsMigration { publicfunctionup() { Schema::create('books',function(Blueprint$table){ $table->increments('id'); $table->string('title',255); $table->unsignedSmallInteger('price')->default(100); $table->timestamps(); }); } publicfunctiondown() { 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の使い方とマイグレーションのやりかたを紹介しました。