PhpStormで始めるLaravel Framework (Model編)

      2016/03/06

>前回の記事
PhpStormで始めるLaravel Framework (Controller/View編)

今日は、LeravalでModelを作るところを解説して行きたいと思います。

前提としてlocalにMySQLがインストールしてあって、データベースも作成済みであることとして解説していきます。
中身のテーブルはLeravalから作れるので空っぽのままで大丈夫です。

まずは、Project内の「.env」ファイルを編集していきます。

DB_HOST=127.0.0.1
DB_DATABASE=db_name
DB_USERNAME=user_name
DB_PASSWORD=password

上記のように、MySQLサーバーへの接続情報を編集していきます。

次に、Modelの作成です。
まずはappフォルダ配下に「Models」フォルダを作成しておきます。
この中にModelクラスのファイルを作成していきます。

次にartisanコマンドでModelのひな形を作っていきます。
PhpStormのTerminalウィンドウから以下のコマンドを実行して下さい。

php artisan make:model Models/Channel --migration

「Channel」は任意のテーブル名に変更して下さい。
なお、Leravalでは慣習的にテーブル名は英語の複数形となりますが、Model名は単数形になるためこのコマンドで指定する名前は単数形になります。
ここではModel名が「Channel」となり、テーブル名は「channels」となります。

コマンドについている「--migration」はマイグレーションファイル(後述)をModelと一緒に作るためのオプションです。
※旧バージョンではオプションがなくても勝手に作成されたのですが5.1からはオプションをつけないと作成されないようになったようです。(解説に使用しているLaravelは5.2です)

さて、Modelsの配下を確認すると「Channel.php」が、database/migrationsの配下を確認すると「2016_02_25_054507_create_channels_table.php」(プレフィクス部分は日付によって変化します)が作成されるので確認して下さい。
ファイルが反映されない場合は、左上のセーブボタンの隣に有るSynchchronizeボタンを押すとリストが更新されます。

migrationの方のファイルを開くと、upメソッドとdownメソッドが出来ていると思います。
upはテーブル作成用、downはテーブル削除用のメソッドです。
upメソッドの中にカラムの定義を書いていきます。デフォルトではidとtimestampしかないと思いますので、以下を参考にして必要なカラムを追加してみて下さい。

public function up()
    {
        Schema::create('channels', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('description');
            $table->boolean('published_flg')->default(false);
            $table->timestamps();
        });
    }

Migrationの編集が終わったら、以下のコマンドにてDBにテーブルを作成します。

php artisan migrate

MySQLを確認すると、テーブルが作成されていると思います。
また、開発中にテーブル構造が変わった場合は再度Migrationを編集してmigrateコマンドによりDBに反映していくという流れで開発を進めていきましょう。
テーブル構造の変更を反映する場合は以下のコマンドを実行してください。

php artisan migrate:refresh

次に、Seederの説明をしていきます。
Seederとは簡単に言うと初期データやテストデータの投入をするためのクラスです。
database/seeds配下に有る「DatabaseSeeder.php」を開いて下さい。
この中にrunメソッドがありますが、この中の処理がコマンドにより実行され記述されたデータがDBに登録される仕組みになっています。
通常、テーブル毎にSeederクラスを作成し、先ほどのrunメソッドの中から各Seederをコールする形になります。
以下にDatabaseSeeder.phpのサンプルを記載しますので、参考にしてみてください。

<?php
use Illuminate\Database\Seeder;
use App\Models\Channel; // 対象テーブルのModelsの読み込みを忘れないように

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call(ChannelsSeeder::class);
    }
}

class ChannelsSeeder extends Seeder {
    public function run(){
        // 最初に全レコード削除
        DB::table('Channels')->delete();

        // レコードの登録
        Channel::create(array(
            'title' => 'テストチャンネル1',
            'description' => 'とっても面白い番組のつまったチャンネルでーす',
            'published_flg' => true,
        ));

        Channel::create(array(
            'title' => 'テストチャンネル2',
            'description' => 'とっても勉強になる番組のつまったチャンネルでーす',
            'published_flg' => false,
        ));
    }
}

そして、Seederを実行するコマンドは以下になります。

php artisan db:seed

上記コマンドを実行すると、DBにデータが登録されると思います。

さて、今度はようやくModelの実装方法に入ります。
初めに作成したModels配下の「Channel.php」を開いて下さい。中身はまだ空っぽです。
実は、何も実装しなくても、レコードの全件検索くらいならこのままで出来てしまいます。

試しに、適当なControllerに以下のコードを書いて実行してみてください。

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\Models\Channel; // 対象テーブルのModelsの読み込みを忘れないように

class WelcomeController extends Controller
{
    public function index(){
        dd(Channel::all());
    }
}

上記Controllerを表示すると、Channelsテーブルの中身が全件取得できます。
※Controllerの使い方については前回の記事を参照して下さい。

ddはデバッグ用の関数です。まあ、var_dump()みたいなものだと思っていて下さい。
Channel::all()にてChannelsのレコードを全権取得してきています。

これだけだと簡単すぎるので、条件を指定して取得する処理をModelの中に記述してみたいと思います。
「Channel.php」を開いて、以下のメソッドを追加して下さい。

class Channel extends Model
{
    public function getPublishedChannels(){
        $channels = Channel::latest('created_at')
            -> where('published_flg', '=', true)
            -> get();
        return $channels;
    }
}

published_flgが有効なものだけ取得するようにしました。
Controller側は以下のように変更します。

class WelcomeController extends Controller
{
    public function index(Channel $channel_model){
        dd($channel_model->getPublishedChannels());
    }
}

全権取得の場合はModelにstaticでアクセスしていましたが、追加したメソッドにアクセスするにはインスタンスが必要です。
Controllerメソッドの引数に追加すれば勝手にDIされるので、それを使ってレコードを取得することが出来ます。

いかがでしたでしょうか?
思ったよりも簡単にDBへのアクセスができました。

 - 技術系(サーバーサイド) , , ,