Server

【PHP開発】Laravel学習(テーブル作成)マイグレーション・モデル・マイグレーションエラー解決

laravel

ココがポイント

PHPでWEBデータベースを作成してみたい!

そう思ってPHPの本を購入して勉強をスタートしてみても挫折の連続でした。

今回は、Udemyの「【作って学ぶ】laravel8とMySQLで作るシンプルメモアプリ」という講座を購入して本格的に勉強してみるつもりです。

まだ、最初の段階ですが、動画をサッとみても忘れてしまいそうなので、このブログにまとめながら学習を進めていこうと思います。

 

マイグレーションとは?

Laravelのマイグレーション機能では、まずマイグレーションファイルというphpファイルを作成して、その中にアプリケーションで利用したいテーブルの定義(カラムの名前・データ型・制約など)を記述します。
マイグレーションファイルはデータベースの設計書のようなもので、設計書を記述し終わった後でArtisan migrateコマンドを実行すると、Laravelがその内容をもとに自動でデータベースを構成します。(引用:レンタルサーバーナレッジ

 

なるほど、つまり、

マイグレーション

データベースのテーブル構造をPHPファイルに記述すれば自動でテーブルを作成してくれる機能

ってことだな。

 

具体的な手順としては、

(1)マイグレーションファイルを作成

php artisan make:migration <ファイル名> --create=<テーブル名>

実際に、やってみました。

マイグレーション

自動的にファイルが作成されていました。

マイグレーション

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class TestDb extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('test_table', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('test_table');
    }
}

 

(2)マイグレーションファイルの編集

(1)で作成されたマイグレーションファイルを元に、実戦で使うテーブル構成などを加えて行けばいいみたいです。

(3)マイグレーションの実行

php artisan migrate

実行することで、MySQLなどに自動でテーブルを作成してくれたり、変更を加えたりできるようです。

 

モデルとは?

モデルはデータベースにアクセスする際に、テーブルを意識せずに新規登録、参照、変更、削除などの操作を可能にするためのもの

つまり、データベース処理において実際に処理をするもの(?)※すみませんが良く理解していません。

よくわかりませんが、データベースのデータを処理するのに必要な物だという事でしょう。

 

モデルを作成する時に注意点があるようです。

注意ポイント

  • 1テーブルに対して1モデル
  • 名前は、テーブルの単数形(※テーブルは複数形)

test_tables(複数形)をテーブルにしたら、test_table(単数形)がモデル名ってことで、自動で紐付されるようです。

単数形と複数形が分からない時は、下記のように調べる事も可能です。

モデル

 

 

実際にモデルを作成してみました。※マイグレーションファイルもテーブル複数に変えて作り変えました。

モデル

下記の場所にモデルのファイルが作成されました。

モデル

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class test_table extends Model
{
    use HasFactory;
}

 

.envファイルってなに?

.envファイルを使って開発環境と本番環境を切り替えたり、データベースなどの接続情報の変更を行うことができます。つまりLaravelにとって重要な設定変更.は.envファイルを介することで簡単に行うことができます。
例えば開発環境では簡易的に利用できるsqliteのデータベースに接続し、本番環境ではmysqlのDBに接続といった変更が可能です。.envファイルの中身は複数のキーと値のペアで記述されており、configディレクトリ下のデータベースを含めた各種機能の設定ファイルの中(database.php, session.php, logging.php etc.)で.envファイルのキーと値が読み込まれています。envはenvironmentの短縮形で意味は環境です。(引用:REFFECT

 

envファイル

 

残念ながら、Laravelを学習し始めの自分には良くわかりませんが、環境設定のようなものでしょうかね!?

必要な時に調べて編集してみたいと思います。

 

 

実作業におけるマイグレーションファイル作成

Udemyの講座に沿ってやっていきたいとおもいますので、モデル名とかテーブル名を合わせて実行してみました。

※新たなプロジェクトとして、「simple-memo」をcomposerからLaravelプロジェクトを作成しました。

動画をみていると、いきなり実作業手順が違います。

さらに詳しく

モデルを作成することでマイグレーションファイルを同時に作成しています

テーブル構成は下記の図のようになります。

テーブル構成

まず、下記の様なコマンドをうち、Memoというモデルを作成すると同時にmemosテーブルを作成するマイグレーションファイルを作成しました。

php artisan make:model Memo -m

-m というオプションを付ける事でマイグレーションファイルも同時作成してくれるようです。

マイグレーションファイル作成

 

続いて、memo_tagsテーブルですが、アンダーバーを使う時は、先頭を大文字にすると自動でアンダーバーになるようです。

Tagsテーブルも作成しました。

モデル作成

下記のように、モデルファイルと、マイグレーションファイルが作成できました。

モデル

マイグレーションファイル

 

テーブル作成前にデータベース作成

まだ良くわかってない自分は、マイグレーションをすれば、自動でデータベースも作成されると思っていましたが、訳の分からないエラーが出て先に進めませんでした。

いろんなサイトで勉強をしてみると、

ココに注意

mysqlでデータベースは作成

するようです。

テーブルはマイグレーションで自動作成されるようですが、データベースは手動で、mysqlにデータベースを作成するようです。

 

mysql

XAMPPのMysqlのAdminをクリックすると、phpMyAdminというデータベースをGUIで管理できるサイトが自動で起動しました。

ここからでも、データベースを作成する事ができますが、コマンドで作成する方法を試してみる事にしました。

もしかしたら以下は省略できるかもしれませんが、自分は、mysqlの管理GUIのphpmyadminのユーザーrootにパスワードを設定しました。

ココに注意

※XAMPPのインストール時は、mysqlのrootパスワードは設定されてないようです

phpmyadmin

自分の場合は、パスワードを設定してしまったので、パスワードありでのデータベース作成をしてみたいと思います。

【mysqlにログイン】

mysql

【データベース確認と作成】

mysql

 

実際に、GUIのphpmyadminで確認しましたら、データベースが作成されていました。

mysql

 

マイグレーションファイル定義

マイグレーションのファイル定義とは、テーブルを作成する上での、フィールド設定の様なものです。

既に、マイグレーションファイルは作成しましたので、そのファイル内に設定していく作業になります。

マイグレーションファイル定義

フィールド名とデータ型を指定する作業の様なもの

ただ、まだよく理解していませんが、リレーションをする為のキー設定なども同時に考えて設定するように思えます。

細かい設定内容は後ほど理解してブログにしてみたいとおもいますが、各マイグレーションファイル定義は下記のようにしました。

create_users_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->unsignedBigInteger('id', true);
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

create_memos_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMemosTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('memos', function (Blueprint $table) {
            $table->unsignedBigInteger('id', true);
            $table->longText('content');
            $table->unsignedBigInteger('user_id');
            // 論理削除 deleted_atを自動生成
            $table->softDeletes();
            // timestampと書くとレコード挿入時、更新時に値が入らないので、DB::rawで直接書いています。
            $table->timestamp('updated_at')->default(\DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
            $table->timestamp('created_at')->default(\DB::raw('CURRENT_TIMESTAMP'));
            $table->foreign('user_id')->references('id')->on('users');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('memos');
    }
}

create_memo_tags_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMemoTagsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('memo_tags', function (Blueprint $table) {
            $table->unsignedBigInteger('memo_id');
            $table->unsignedBigInteger('tag_id');

            $table->foreign('memo_id')->references('id')->on('memos');
            $table->foreign('tag_id')->references('id')->on('tags');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('memo_tags');
    }
}

create_tags_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTagsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->unsignedBigInteger('id', true);
            $table->string('name');
            $table->unsignedBigInteger('user_id');
            // 論理削除 deleted_atを自動生成
            $table->softDeletes();
            // timestampと書くとレコード挿入時、更新時に値が入らないので、DB::rawで直接書いています。
            $table->timestamp('updated_at')->default(\DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
            $table->timestamp('created_at')->default(\DB::raw('CURRENT_TIMESTAMP'));
            $table->foreign('user_id')->references('id')->on('users');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tags');
    }
}

 

実際にマイグレーションを実行

実際にマイグレーションを実行する前に、Laravelプロジェクト(simple-memo)からmysqlに接続するための設定が必要なようです。

.envファイル内のデータベース接続設定(simple-mome内にある)

database.php内のデータベース接続設定(simple-mome/config内にある)

上記の2つのファイル内に、自分で設定したパスワード(mysqlと同じもの)を記入しました。

php artisan migrate

エラー発生でした!

マイグレーション

 

unsignedBigIntenger(NG)⇒unsignedBigInteger(OK)

つづりが違っていました。

エディターで、Visual Studio Codeを使っていますが、つづりの相違などはチェックできないものでしょうかね!?

 

気を取り直して、マイグレーションの実行をしました。

再びエラー発生!

php artisan migrate

 

unsignedBigInteger('mmemo_id');(NG)⇒unsignedBigInteger('memo_id');(NG)

つづりが間違っていました。

 

再々エラー発生!

php artisan migrate

いったん、phpmyadminから全テーブルを削除してから実行しました。

php artisan migrate

マイグレーションエラー

外部キーが・・・ナニコレ!?

イロイロ探し回って、マイグレーションの時に、実行される

ココに注意

マイグレーションファイルの順番が関係していることがわかりました

 

つまり、外部キーを設定したテーブルを作成したいけど、そのテーブルが無いよって事をいっているようです。

マイグレーションエラー

tagsのマイグレーションファイル定義の名前を、2021_12_17_043000_create_tags_table.phpに変更して実行してみました。

tagsテーブルを作成することができましたが、新たなエラーが発生!!

php artisan migrate

もうヤケになりました!!

最終的に下記のマイグレーションファイルの並び順にしたら成功しました。

マイグレーションエラー

 

ココがポイント

外部キーを連結させるテーブルは最後にする

って事のようですね。

マイグレーション時に、先にテーブルを作成すると何かとエラーになるようです。

本当に長い道のりでした。

マイグレーション

 

-Server
-, , , , , , , ,

Translate »

© 2022 PCTips