Laravel5.2でモデルの作成

2018/10/12

mvc_laravel_model

前回DBのTABLEを制作しました。

マイグレーション機能を使って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を作成しました。

マイグレーション機能を使ってDBのTABLEを作成

このTABLEに対応するモデルを作成して、tinkerコマンドでデータを挿入してみます。

なお、このTABLEに対応するフォームはすでに作成しています。

入力した内容を表示する簡単なフォームを作成

 

実現したいこと

  1. 以前、作成したフォームに対応したモデルを作成
  2. tinkerコマンドでデータの挿入

 

手順

1. モデルファイルの作成

コマンドプロンプトを起動してLaravelのプロジェクトのフォルダまで移動します。

Artisanコマンドでモデルファイルを自動生成します。

php artisan make:model Greeting

モデル名は単数形で命名します。

model01

 

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つ挿入してみました。

model02

 

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です。

model03

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-基礎知識