2017/07/31
Laravel5.4 HelloWorld の続きでございます。その前の PHPフレームワーク Laravelを使ってみる でも大まかにしか動かしていませんし、手探り状態の覚書なのでいっぱいすっ飛ばしていますが、次へと進んでいきます。
遅ればせながら環境は、Windows10Pro64bitにxamppをインストールしています。
phpinfoによればPHP Version 7.1.7です。
コマンドラインからCDc:\xampp\mysql\binに移動してmysql --versionするとmysql Ver 15.1 Distrib 10.1.25-MariaDB, for Win32 (AMD64)と表示されました。
まずはMySQLにDBを作成します。xamppのphpmyadminで任意の名前(netkansai)でDBを作成します。この時照合順序をutf8mb4_unicode_ciにしておくようです。絵文字などに対応できるようにとのことです。
次のこのDBに接続できるように接続情報を設定します。Laravel 5.4 データベース:利用開始によればデータベース設定ファイルはconfig/database.phpです。とあります。ですがいろいろなサイトを見てみるとインストールフォルダ直下にある.envというファイルに記述するのが正解のようです。,envをdatabase.phpが読み込むようです。
.envにはいくつかのデータベースの設定が書けるようになっていますが今回はMySQLを使用しますので
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead をDB_DATABASE=netkansai
DB_USERNAME=homestead をDB_USERNAME=root
DB_PASSWORD=secret をDB_PASSWORD=
3か所変更しておきます。DB_PASSWORD=の右は何もいれずに改行です。
DB作成、接続情報設定しました。まだテーブルもありませんしデータもありません。ここでLaravel技の登場です。migrateというのを行います。テーブルの定義を作ってそれをきちんと残しておいてあとから誰でも全く同じ構造のDBが作成できるようにとのことです。
個人的にはcreate tabelのSQLを残しておいてCREATE table IF NOT EXISTS table名 のようなスクリプトを作ってますのでそれと同じような物だと理解。
コマンドプロンプトでインストールフォルダに移動して
php artisan migrate
を実行します。
successfullyと表示されますがその下にSyntax errorとか出てますね。どうもエラーのようです。
エラーメッセージのSyntax error or access violation: 1071 Specified key was too long; max key length is 767 bytesでググるといくつかそれらしい解決方法が出てきます。
それらの中からLaravel5.4 + MySQL5.5.9 でusersテーブルのマイグレーション時に Syntax errorを見てみるとMySQLではユニーク制約を付けたカラムには767bytesまでしか入らないというのが原因らしいです。MySQLのバージョンによっては問題解決されているようなのでエラーが出ないかもしれません。
更に解決法があるようなので(カラムの最大値を変更し、767bytes以上の文字列が入らないようにする)その通りにします。
インストールフォルダ/app/Providers/AppServiceProvider.phpを開きます。
AppServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
に
use Illuminate\Support\Facades\Schema;
を追記します。更に
public function boot()内に
Schema::defaultStringLength(191);
を記述します。
AppServiceProvider.php(修正後)
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema; // 追記
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191); // 追記
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
ファイルを修正し保存します。DBを削除して作り直すか、既存のテーブル(先ほどエラーが出ていましたがいくつかテーブルができているはず)を削除して、再度
php artisan migrate
を実行します。
今回はエラーが発生しませんでした。
phpmyadminで確認してみます。
3つテーブルが作成されています。これらはシステム(Laravel自体)が使うテーブルのようです。ユーザー認証もLaravelでできるようなのでそのあたりのテーブルもできているようです。ユーザー認証までたどり着くか?
自分でDB接続のお試しのためには新たにtableを作ります。その前にいったん確認です。
インストールフォルダ/database/migrationフォルダを開きます。
やたら長い名前のファイルがあります。日付とテーブル名が入っているようです。ファイルの中身はテーブルのカラムの設定が書かれているようです。
どうやらmigrateする際にこのファイルを読み込んでテーブルを作成していたようです。これらのファイルをマイグレーションファイルと呼んでいるようです。Laravelではテーブルを作成するときに空のテーブルをコマンドで作成し、空の?マイグレーションファイルを自動生成します。自動生成されたマイグレーションファイルにフィールドの定義を設定し、マイグレーションファイルをコマンドで実行することでテーブル作成するようです。
php artisan make:migration マイグレーション名
とすることでマイグレーションファイルが作成されます。マイグレーション名ですがテーブルを作成しますので
create_テーブル名_table
とするようです。更にテーブル名は主に複数形を使うようですがそのあたりは適当にしてください。で、これだけではテーブルは作成されませんので
php artisan make:migration create_テーブル名_table --create=テーブル名
とすることで空のテーブルと空のマイグレーションファイルが作成されます。今回はcategoriesテーブルを作成してみます。
php artisan make:migration create_categories_table --create=categories
を実行します。
エラーもなくうまくいったようですがまだテーブルは作成されていません。これでテーブルができると思ったんですが。インストールフォルダ/database/migrationフォルダにマイグレーションファイルが作成されていますので中身を確認します。
2017_07_31_120825_create_categories_table.php
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateCategoriesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('categories');
}
}
up()の中に
$table->increments('id');
$table->timestamps();
とあります。カラムの型とカラム名のようです。$table->timestamps();で自動でcreated_atとupdated_atというカラムが作成されるようです。これ以外に、
TEXT型のname NOT NULLと
TEXT型のshow_nameを追加したいと思います。
書き方はLaravel 5.4 データベース:マイグレーションhttps://readouble.com/laravel/5.4/ja/migrations.htmlの使用できるカラムタイプに詳しく掲載されています。
以下引用
コマンド | 説明 |
---|---|
$table->bigIncrements('id'); |
「符号なしBIGINT」を使用した自動増分ID(主キー) |
$table->bigInteger('votes'); |
BIGINTカラム |
$table->binary('data'); |
BLOBカラム |
$table->boolean('confirmed'); |
BOOLEANカラム |
$table->char('name', 4); |
長さを指定するCHARカラム |
$table->date('created_at'); |
DATEカラム |
$table->dateTime('created_at'); |
DATETIMEカラム |
$table->dateTimeTz('created_at'); |
タイムゾーン付きDATETIMEカラム |
$table->decimal('amount', 5, 2); |
有効/小数点以下桁数指定のDECIMALカラム |
$table->double('column', 15, 8); |
15桁、小数点以下8桁のDOUBLEカラム |
$table->enum('choices', ['foo', 'bar']); |
ENUMカラム |
$table->float('amount', 8, 2); |
8桁、小数点以下2桁のFLOATカラム |
$table->increments('id'); |
「符号なしINT」を使用した自動増分ID(主キー) |
$table->integer('votes'); |
INTEGERカラム |
$table->ipAddress('visitor'); |
IPアドレスカラム |
$table->json('options'); |
JSONフィールド |
$table->jsonb('options'); |
JSONBフィールド |
$table->longText('description'); |
LONGTEXTカラム |
$table->macAddress('device'); |
MACアドレスカラム |
$table->mediumIncrements('id'); |
「符号なしMEDIUMINT」を使用した自動増分ID(主キー) |
$table->mediumInteger('numbers'); |
MEDIUMINTカラム |
$table->mediumText('description'); |
MEDIUMTEXTカラム |
$table->morphs('taggable'); |
符号なしINTERGERのtaggable_id と文字列のtaggable_type を追加 |
$table->nullableMorphs('taggable'); |
Nullableなmorphs() カラム |
$table->nullableTimestamps(); |
Nullableなtimestamps() カラム |
$table->rememberToken(); |
VARCHAR(100) NULLのremember_token を追加 |
$table->smallIncrements('id'); |
「符号なしSMALLINT」を使用した自動増分ID(主キー) |
$table->smallInteger('votes'); |
SMALLINTカラム |
$table->softDeletes(); |
ソフトデリートのためにNULL値可能なdeleted_at カラム追加 |
$table->string('email'); |
VARCHARカラム |
$table->string('name', 100); |
長さ指定のVARCHARカラム |
$table->text('description'); |
TEXTカラム |
$table->time('sunrise'); |
TIMEカラム |
$table->timeTz('sunrise'); |
タイムゾーン付きTIMEカラム |
$table->tinyInteger('numbers'); |
TINYINTカラム |
$table->timestamp('added_on'); |
TIMESTAMPカラム |
$table->timestampTz('added_on'); |
タイムゾーン付きTIMESTAMPカラム |
$table->timestamps(); |
NULL値可能なcreated_at とupdated_at カラム追加 |
$table->timestampsTz(); |
タイムゾーン付きでNULL値可能なcreated_at とupdated_at カラム追加 |
$table->unsignedBigInteger('votes'); |
符号なしBIGINTカラム |
$table->unsignedInteger('votes'); |
符号なしINTカラム |
$table->unsignedMediumInteger('votes'); |
符号なしMEDIUMINTカラム |
$table->unsignedSmallInteger('votes'); |
符号なしSMALLINTカラム |
$table->unsignedTinyInteger('votes'); |
符号なしTINYINTカラム |
$table->uuid('id'); |
データベース向けのUUID類似値 |
また、これ以外に修飾子というのがありますインデックス修飾子は含まれていません。
修飾子 | 説明 |
---|---|
->after('column') |
指定カラムの次にカラムを設置する(MySQLのみ) |
->comment('my comment') |
カラムにコメント追加 |
->default($value) |
カラムのデフォルト(default)値設定 |
->first() |
カラムをテーブルの最初(first)に設置する |
->nullable() |
カラムにNULL値を許す |
->storedAs($expression) |
stored generatedカラムにする(MySQLのみ) |
->unsigned() |
整数(integer)を符号無し(unsigned)にする |
->virtualAs($expression) |
virtual generatedカラムにする(MySQLのみ) |
まで引用
ということで public function up()に
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->increments('id');
$table->text('name'); // 追記
$table->text('show_name')->nullable(); // 追記
$table->timestamps();
});
}
として保存します。そして
php artisan migrate
します。
エラーが表示されませんのでうまくいったのでしょう。更にphpmyadminでも確認します。
思ったテーブルが作成されました。テーブルが作成出来たらDROP TABLE文やALTER TABLE文の確認ですが、今回はテーブル作成までとしておきます。