aircolor memolog

Web制作・テクノロジー、たまに旅行記

Laravel 5.7: MySQLを利用する最短手順

実務と勉強を兼ねてわかったことを書く備忘録シリーズ。今回はLaravelでMySQLを利用するための最短手順を書く。

前提

前回の記事等でLaravelのセットアップ済みなことが前提。

開発・検証環境

やるべきこと

MySQLをLaravelで使えるようにするには最短で以下の手順が必要。若干やることが多い。

  1. env設定
    • MAMP経由でMySQLを繋ぐ場合(オプション)
  2. マイグレーション
    • シーディング(オプション)
  3. Modelの作成
  4. Controllerの作成
  5. Viewの編集
  6. Route設定

env設定

DBの接続先を指定する。ルートディレクトリ配下.envファイルのDB_CONNECTION=mysql以下を用意したDB設定値に書き換える。

DB_CONNECTION=mysql
DB_HOST=localhost #DBのホスト名
DB_PORT=0000 #DBのport
DB_DATABASE=DB #DB名
DB_USERNAME=xxxx #DBのユーザ名
DB_PASSWORD=xxxx #DBのパスワード

MAMP経由でMySQLを繋ぐ場合(オプション)

MySQLMAMP経由で接続する場合はconfig/database.phpMAMPunix_socketを設定する必要がある。詳しくは以下の記事に記述されている。

qiita.com

マイグレーション

マイグレーションとは、データベースの追加や変更などのバージョンを管理する機能のこと。DBを使うには、まずマイグレーションファイルの作成(DB定義ファイル作成)を行なう必要がある。

$ php artisan make:migration {{ マイグレーションファイル名 }}

例えばマイグレーションファイル名をcreate_samples_tableとすると、database/migrations/配下にyyyy_mm_dd_hhmmss_create_samples_table.php(yyyyとかは作成日付)というファイル名で作成される。 作成後、yyyy_mm_dd_hhmmss_create_samples_table.phpを開き、Schema内のコードに設定したいレコード値を指定する。

~省略~
public function up()
{
    Schema::create('samples', function (Blueprint $table) {
        $table->increments('id');
        $table->string('title');
        $table->string('body');
        $table->string('username');
        $table->timestamps();
    });
}

設定が終わったら、migrateコマンドを実行してenvで接続済みのDBサーバ内にTableを作成する。

php artisan migrate

シーディング(オプション)

Laravelに用意されているシーディングクラスを使うことで、データベースへ初期データを簡単に投入できる。この作業はオプションだが、毎回の初期構築の手間を省けるのでオススメ。

$ php artisan make:seeder SamplesTableSeeder

実行するとdatabase/seeds/配下にSeederファイルが生成される。何も書かれていないpublic function run()内に以下コードを記述する。

<?php

use Illuminate\Database\Seeder;

class SamplesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('samples')->truncate(); // 全レコードを削除、自動増分のIDを0にリセット
        DB::table('samples')->insert([  // テーブルにデータをInsert
                'title'      => 'TestA',
                'body'       => 'TestA Body.',
                'username'   => 'userA',
                'created_at' => '2019-01-01 14:00:00',
                'updated_at' => '2019-01-01 14:00:00',
            ]//以下省略
        ]);
    }
}

シーダクラスをコールするための設定

artisanコマンド実行時にシーダークラスを呼び出すためにdatabase/seeds/DatabaseSeeder.phprun()内にcallを追記。

<?php

use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call('SamplesTableSeeder');
    }
}

※他記事でSeeder内で書かれているModel:unguardってなに?と思ったので調べたらStackOverflowの記事にはすべてのModelプロパティにSeedできると書かれていた。

シーディング実行

db:seedコマンドを実行すると指定DBにデータがインサートされる。実行完了後に確認してInsertされていれば完了。

$ php artisan db:seed

Model作成

当たり前だがLaravelのview上で直接DBの値を編集するのはお勧めできないので、お作法に則りまずはModel と Controllerを作成する。

$ php artisan make:model Sample

app/Sample.phpというModelファイルが生成される。 Modelを定義することでDBを操作できるようになるが、予期しない代入を防ぐために$fillable$guarded値を設定する必要がある。Eloquent ORMによるデータ実装に必要だが、説明が肥大化しそうなので、ここでは詳しい説明を省く。知りたい場合は参考の公式ドキュメントを参照すべし。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Sample extends Model
{
    protected $fillable = ['title', 'body', 'username']; // 複数代入時に代入を許可する属性を配列で設定
}

参考

Controller作成

viewにModelの値を渡すためのControllerを作成する。以下のコマンドを実行するとHttp/Controllers/内にSampleController.phpというControllerファイルが生成される。

php artisan make:controller SampleController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;  // 追加
use App\Sample; // 定義したModelを追加

class SamplesController extends Controller
{
    public function index ()
    {
       $sample_array = Sample::all()->toArray(); // Collection操作して配列に変更

       return view('index', compact('sample_array')); // compact関数を通して配列をviewに渡す
    }
}

参考

Viewの編集

受け取ったデータ(配列)をblade上で表示するためにはbladeの繰り返し用ディレクティブを使って表示する。

@foreach($sample_array as $sample)
<div>{{{ $sample['title'] }}}</div>
@endforeach

参考

Route設定

最後にRoute設定。route/web.php上にRoute::get()を新規で設定。Controllerを通してViewを返す処理にする。@を付けてindexを書くと、SamplesControllerのindex()が実行できる。指定のURLでViewが確認できれば作業完了。

Route::get('/', 'SamplesController@index');

まとめ

  • シーディングを上手く使うことで、初期構築を共通化できるのは便利そう、一気にDBにインサートできるのも良い感じ
  • 次回はDBの詳しい操作とRESTful APIの作り方を書く予定

参考