webアプリケーションでよくありがちの定番機能がCRUD機能です。CRUD機能はある対象をCreate, Read, Update, Deleteする機能です。webアプリケーションでよく使われるデータの保存方法がDB(データベース)です。最近はデータの保存場所として使うだけならサーバを介さずFirebaseを使う時もある様ですが、自分の業務範囲でよく使われるのはDBです。定番と定番が組み合わさると冗長な決まりきった手順を繰り返すことになります。そういったことは自動化したくなります。自分の場合、DBを元にEloquentモデル、リソースコントローラ、リソースコントローラ用のRequestを作ることになります。これを成すためにはDB内の詳しい情報が必要です。この記事ではLaravelのDB内の詳しい情報を読み取りやすくしてくれるSchemaファーサードのちょっとした機能を紹介します。
Illuminate\Database\Schema | Laravel API
SchemaファサードをLaravelの中で最も使っているのはマイグレーション機能です。例えば、次の様なマイグレーション用のコードがあります。
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateFlightsTable extends Migration { /** * マイグレーション実行 * * @return void */ public function up() { Schema::create('flights', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->string('airline'); $table->timestamps(); }); } /** * マイグレーションを元に戻す * * @return void */ public function down() { Schema::drop('flights'); } }
Schemaはテーブルの作成、削除を行っています。Schemaの名の通り、データベースそのものを表現したファサードです。これの中に隠されているのがDoctrineです。
Doctrine: PHP Open Source Project
Doctrineは特別クエリを書くことなくいい感じにDB中の情報を持ってくるのに役立ちます。Laravel内ではSchemaファサードを用いるためかDB接続済みDoctrineを次の一行で簡単に呼び出せるようになっています。
$this->schemaManager = DB::getDoctrineSchemaManager();
Doctrineはデータベース内の情報をマッピングしたモデルぐらいに考えても大丈夫なくらい詳細にそのままの名前で作られています。例えば、
$this->schemaManager->listTableColumns('migrations');
で次のような情報が得られます。
array:3 [ "id" => Doctrine\DBAL\Schema\Column {#1285 #_type: Doctrine\DBAL\Types\IntegerType {#1309} #_length: null #_precision: 10 #_scale: 0 #_unsigned: true #_fixed: false #_notnull: true #_default: null #_autoincrement: true #_platformOptions: [] #_columnDefinition: null #_comment: null #_customSchemaOptions: [] #_name: "id" #_namespace: null #_quoted: false } "migration" => Doctrine\DBAL\Schema\Column {#1320 #_type: Doctrine\DBAL\Types\StringType {#1315} #_length: 255 #_precision: 10 #_scale: 0 #_unsigned: false #_fixed: false #_notnull: true #_default: null #_autoincrement: false #_platformOptions: array:2 [ "charset" => "utf8mb4" "collation" => "utf8mb4_unicode_ci" ] #_columnDefinition: null #_comment: null #_customSchemaOptions: [] #_name: "migration" #_namespace: null #_quoted: false } "batch" => Doctrine\DBAL\Schema\Column {#1321 #_type: Doctrine\DBAL\Types\IntegerType {#1309} #_length: null #_precision: 10 #_scale: 0 #_unsigned: false #_fixed: false #_notnull: true #_default: null #_autoincrement: false #_platformOptions: [] #_columnDefinition: null #_comment: null #_customSchemaOptions: [] #_name: "batch" #_namespace: null #_quoted: false } ]
これにより目視で設計書ないしORMの内部を見ながらデータの型やリレーションを見なくともプログラム内でそれらを扱えます。例えば、nullableでvarchar(255)なカラムhogeがあればその情報を持ってきてモデル中に ‘hoge’ => ‘nullable|string|max:255’ と自動生成するコードを記述できます。listTableColumnsは一例ですが、他にも有用なものが多くあります。
LaravelとDoctrineの連携による自動生成では laravel-generator が最大手といっても過言ではなく、優秀なお手本です。
InfyOmLabs/laravel-generator: InfyOm Laravel Generator – API, Scaffold, Tests, CRUD Laravel Generator
InfyOm Laravel Generator : Laravel Scaffold, CRUD, API Generator
laravel-generatorはその名の通りlaravelのコード(マイグレーション、モデル、コントローラ、フォームリクエスト、Vue.jsのフロントエンドなど)を生成するプログラムです。生成元のデータとしてDBを扱うこともでき、その際はDoctrineを駆使してtable中のデータを元に色々なモノを作ります。試したところ自分の求めるものを満たすことができないのでそのまま使ってはいませんが、そんなことができるコードをそんな分かりやすく簡単に書けるのかとよく驚かされます。