Laravel初心者講座のシリーズもいよいよ最終回、モデル編です。
トロトロしているうちにあっという間にLaravel5がリリースされてしまい、こちらの連載をどうしようか悩んだのですが、まずはLaravel4での解説をちゃんと完結させることにします。私自身まだLaravel5を試せていないから仕方ない。
MVCの概念についてはルーティング編でざっくり説明していますが、モデルは「データを管理する」役割の部分です。
モデルを簡単に扱えることこそ、PHPのフレームワークを使う一番のメリットといえるかもしれません。
DBと面倒なデータのやりとりをこなさなければいけない場面で、毎回SQL文を(しかもセキュリティ面を常に担保しつつ)書く労力を想像してみましょう(私は嫌です)。
その面倒な部分を丸投げ出来るのがフレームワークのORMです(ありがとうORM)。
突然出てきたORMとは何者か。
オブジェクト指向型のフレームワークのモデルは大抵"ORM"という機能を持っています。
"Object-relational mapping"の略で、DBのデータをオブジェクトとして扱ってしまおうという代物です。
DBが持っているID=1のユーザの名前データを引き出したい時、SQL文でまずそのユーザのデータを選択し、そこからユーザ名を抽出する、という流れになります。
やっぱり別のユーザの情報も欲しい、となったらまたSELECTでユーザを検索することになります。
PHP構文とSQL構文をハイブリッドしたときの読みづらさ、書きづらさも相まって、この手の操作はなかなか憂鬱な気分にさせてくれます。
そこでORMを使うとどうなるか。
「まずユーザのテーブルをまるっとオブジェクトにしてー、id=1で検索してー、そのnameを取り出して-」
「さっきのテーブルのオブジェクトから今度はid=2を検索して-。そのnameを取り出してー」
このグダっとした日本語と同じような簡単な文一発でデータの抽出ができます。
抽象的な説明はこのくらいにして、具体的な使い方を説明しましょう。
LaravelのORMには"EloquentORM"という名前が付いています。
ここでは例としてユーザデータを管理するDBのテーブルを作成し、そこにユーザ情報を登録したり引き出したりという作業を想定します。
まずユーザ管理用のテーブルを作成しなきゃいけないわけですが、ただ空っぽのテーブルから自分でスキーマを作成するよりイケてる方法がLaravelにはあります。
テーブルのひな形を作成してくれるマイグレーション機能です。
まずコマンドラインで以下のように叩きます。
php artisan migrate:make create_users_table
これでapp/database/migrationsにテーブルを作成するためのプログラムが生成されました。
出来たファイルを開いて、up()の中に作成したいテーブルのスキーマを書いていきます。
public function up() { Schema::create('users', function($table) { $table->increments('id'); $table->string('email')->unique(); $table->string('name'); $table->text('address'); $table->timestamps(); }); } public function down() { Schema::drop('users'); }
上の記述を読むだけでなんとなく分かっていただけると思うのですが、$table->型('カラム名')の形式です。unique()を足したらユニーク属性になるわけですね。
ここまで出来たら、最後にコマンドでマイグレーションを実行します。
php artisan migrate
これでusersテーブルがDBに作成されました。
Laravel4ではapp/model以下にモデルクラスを定義します(Laravel5ではmodelディレクトリが廃止されたらしいので注意)。
まず
app/model/User.php
というファイルを設置します。
決まりごととして、ファイル名とその中身のクラス名をUserと決めたのであれば、使用するテーブル名は自動的にその複数形のusersである必要があります。
※それ以外の名前にしたい場合は、テーブル名を特別に指定することもできます。
User.phpに以下のように書いてみましょう。
class User extends Eloquent {}
なんとびっくりこれだけでUserモデルが完成しました。
あとは煮るなり焼くなり好きにして下さい。
折角モデルを作ったので、ちゃんとデータの扱いまで触れておくことにします。
まずユーザデータを一件追加してみましょう。
とあるコントローラで以下のように書いて実行させます。
<?php //略 $newUser = new User; $newUser->email = 'mio@email.com'; $newUser->name = 'mio.satoh'; $newUser->address = '東京都港区西麻布1-14-17 WAVE西麻布3F User::firstOrCreate($newUser->getAttributes());
new Userとしたところで、先ほど作ったモデルを元にユーザのオブジェクトが生成されます。
各カラムのデータを入力して、最後にfirstOrCreate(Userオブジェクト->getAttributes())とすれば、それだけでデータ登録が完了です。
ちなみに"firstOrCreate()"というのは、既にそのデータが存在するかどうかをチェックしてから登録するメソッドなので、そのチェックが必要なければ"create()"でもOKです。
今度は登録したデータを引き出してみます。
今回作ったusersテーブルではidとemailがユニークデータなので、emailからnameを引いてくることにしましょう。
とあるコントローラで以下のように書きます。
<?php //略 $user = User::where('email', 'mio@email.com')->get(); $name = $user->name;
はい、これだけで取得できました。
単純なデータ検索ではwhere()を使うことが多いと思いますが、idで一発取得するfind()や、データを更新するsave()、削除するdelete()などが基本となります。
他にもEloquent独自の様々な検索や操作のメソッドが用意されているので、詳しくは公式リファレンスを参照していただきたく。
EloquentORMの威力がお分かりいただけたでしょうか。
ここではとても紹介しきれないほど、LaravelのEloquentORMは多彩な機能を持っていて、一度使えば素のSQL関数には戻れなくなること請け合いです。
Laravel5になると4で貧弱だった部分がさらに強化されているようなので、次の連載でお会いするときは生まれ変わったLaravelをまた紹介できたらいいですね。