2018/10/12
前回DBのTABLEを制作しました。
LaravelでDBのデータを扱う方法は二つあります。
- QueryBuilder(DB::*)
- Eloquent ORM
今回はEloquent ORMを利用してみます。
Eloquent (エロクエント)とは
LaravelでDBを操作する方法としてDBクラスを利用したやり方があります。
class GreetingController extends Controller { public function getIndex(Request $request) { $data = DB::select('select * from greetings'); return view('greeting', ['data' => $data]); } }
しかしLaravelでWEBアプリを作成する場合、あまりこのやり方はしません。
「ORM(Object/Relational Mapping)」と呼ばれる技術を主に使います。
ORMとは、オブジェクト(PHP)とリレーショナルデータベース(MySQL)のデータの間をマッピング(対応付け)する技術です。
DBのTABLEにあるデータをPHPのオブジェクトに変換したり、逆にPHPのオブジェクトをそのままDBのTABLEのデータに変換したりする機能を提供します。
PHP側では、ただ用意したクラスを操作するだけで、対応するDBのTABLEを自動的に操作できるようになります。
Laravelには、Eloquent (エロクエント)というORMが搭載されていますので、これを利用します。
Modelの作成
Eloquent ORMを利用するためには、Modelを定義する必要があります。
モデル名は対応するDBのTABLE名の単数形でアッパーキャメルにします。
例えば examples というDBのTABLEを利用するモデル名は必然的に Example になります。
こうすることでExampleのモデルはexamplesというDBのTABLEからデータを取得できるようになります。
Modelの作成はControllerの作成と同様にArtisanコマンドを使います。
php artisan make:model (モデル名)
Artisanコマンドを実行したらappディレクトリの直下にモデルが自動生成されます。
Modelファイルを開くとこのように記述されています。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class (モデル名) extends Model { // }
Modelファイルを作成しても、このままではデータを挿入することができません。
Laravelではデフォルトでマスアサインメント機能が有効になっているからです。
※意図せぬリクエストによって悪意のあるデータが挿入されてしまう脆弱性をマスアサインメントといいます。
DBに挿入できるようにするにはこのModelファイルにカラムを宣言していきます。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class (モデル名) extends Model { #データを挿入できるようにするにはfillable 変数に配列で宣言します。 protected $fillable = ['カラム名', 'カラム名', 'カラム名']; }
上記のようにすれば、データの挿入が可能になります。
tinkerとは
Modelファイルができたら何かデータをDBに挿入してみます。
このときに便利なのがArtisanにあるtinkerというコマンドです。
php artisan tinker
このコマンドを使うと対話的にデータの挿入が行えます。
#モデルクラスをnewすることで、メモリー上に新規のインスタンスを作成。 $モデル名 = new App\モデルのクラス名(); # 値をセット $モデル名->カラム名 = '挿入したい値'; # DBにデータを保存 $モデル名->save();
createメソッドを使うと一気にやることもできます。
App\モデルクラス名::create(['カラム名'=>'挿入したい値']);
チュートリアル
前回、マイグレーション機能を使ってDBのTABLEを作成しました。
このTABLEに対応するモデルを作成して、tinkerコマンドでデータを挿入してみます。
なお、このTABLEに対応するフォームはすでに作成しています。
実現したいこと
- 以前、作成したフォームに対応したモデルを作成
- tinkerコマンドでデータの挿入
手順
1. モデルファイルの作成
コマンドプロンプトを起動してLaravelのプロジェクトのフォルダまで移動します。
Artisanコマンドでモデルファイルを自動生成します。
php artisan make:model Greeting
モデル名は単数形で命名します。
2. モデルの編集
appディレクトリの直下に作成されたGreeting.phpを編集します。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Greeting extends Model { //挿入できるようにカラムを宣言 protected $fillable = ['onamae']; }
3. tinkerコマンドでデータの挿入
tinkerを使って、Greetingモデルを操作します。
コマンドプロンプトに戻って以下のコマンドを実行します。
php artisan tinker App\Greeting::create(['onamae'=>'laravel']); App\Greeting::create(['onamae'=>'fuelPHP']); App\Greeting::create(['onamae'=>'CakePHP']);
レコードを3つ挿入してみました。
4. DBのTABLEの確認
exitでtinkerから抜けてmysqlに入ります。
※コマンドプロンプトでmysqlに入るようにするには事前にmysqlのPATHを通しておく必要があります。
#laravel_userというユーザでパスワードつきでログイン mysql -u laravel_user -p (※passwordを入力) #DBを選択 use my_laravel #greetingsテーブルの中身を表示 select * from greetings;
mysqlの設定は以前に設定しました。
以下のような画面になったらOKです。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。