質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

7037閲覧

PHP + Laravelでmigration時にmigrationsテーブルに登録されない

capyasutti

総合スコア1

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2020/07/15 00:31

編集2020/07/16 14:33

当方PHP + Laravelを勉強し始め、下記環境情報に記載した環境下で動作検証を行っていますが、
下記に記載した問題が発生しております。
原因、解決方法をご教示しただけたら幸いです。

発生している問題

ローカルに作成したMySQLサーバーにて新規テーブルを作成するために、新たにマイグレーション
ファイルを作成しマイグレーションを実行したところ、テーブルは正しく作成されましたが、
使用したマイグレーションファイルがmigrationsテーブルに登録されません。
作成したマイグレーションファイルをmigrationsテーブルで管理するにはなにか特別な設定が必要なのでしょうか?

なお、全てのマイグレーションファイルが登録されないわけではなく、認証画面の自動作成導入時に
作成された"users"等のマイグレーションファイルは登録されます。

DBへの一部登録も行われていることから、DB接続情報に問題は無いという認識です。

環境情報(FW/ツールのバージョンなど)

  • OS : Windows10 Home
  • PHP(php -v で確認) : 7.3.20

※PHP 7.3.20 (cli) (built: Jul 7 2020 11:12:26) ( ZTS MSVC15 (Visual C++ 2017) x86 )

  • Laravel(php artisan --versionで確認) : 7.19.1

※Laravel Framework 7.19.1

  • MySQL(mysql --versionで確認) : 8.0

※C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe Ver 8.0.19 for Win64 on x86_64 (MySQL Community Server - GPL)

マイグレーションファイルの作成~実施手順(booksテーブル)

  1. php artisan make:migration create_books_table --create=booksを実行
  2. 1で作成されたファイルのup()内を適宜修正 (内容は下記に記載)
  3. php artisan migrateを実行 (エラーメッセージは特に出力されない)

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

2020_07_14_133344_create_books_table.php

1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class CreateBooksTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::create('books', function (Blueprint $table) { 17 $table->increments('id'); 18 $table->string('title', 100); 19 $table->string('author', 40)->nullable(); 20 $table->integer('volume')->nullable(); 21 $table->timestamps(); 22 }); 23 } 24 25 /** 26 * Reverse the migrations. 27 * 28 * @return void 29 */ 30 public function down() 31 { 32 Schema::dropIfExists('books'); 33 } 34}

その他マイグレーションファイル、migrate実行後のDB内容

  • 作成したマイグレーションファイルを含む全てのファイル

作成したマイグレーションファイルを含む全てのファイル

  • マイグレーション実施前~実施後のDB  

<実施前>
実施前

<実施前migrationsテーブル内容>
migrations内容

<migrate実施>
イメージ説明

<実施後> ※各種テーブルが作成されている
イメージ説明

<実施後migrationsテーブル内容> ※作成されたテーブルのうち"books"だけ未登録
イメージ説明

試したこと

・freshコマンドでの再実施
php artisan migrate:freshを実施し、再度マイグレーションを再実施
→ エラーなく終了するが変化なし

・reset → migrateを実施
php artisan migrate:resetを実施
→ migrationsテーブルに"books"の情報が入っていないので、"books"のドロップは行われず。(手動でDropを実施)
→ また"books"、"migrations"以外のテーブルはドロップされたが、migrationsテーブルに登録されたレコードのうち"2014_10_12_000000_create_users_table"が削除されず。(手動で削除を実施)

php artisan migrateを実施
→ 結果は初回時と同じ

※なお上記対応後、migrationsに"2020_07_14_133344_create_books_table"を追加し、migrate:resetを行ったところ、"books"は削除されましたが、migrationsの"~create_users~"
は残ったままとなりました。

その他情報

今回の動作検証を行う前にLaravelで用意されている認証機能の導入を行いましたcomposer require ※laravel/ui → php artisan ui vue --auth
認証画面は正しく表示され、登録画面での登録もエラーなく実施されるのですが、実際には登録内容がusersテーブルに登録されないという問題が発生しています。(未解決)
こちらの現象とも関わりがありそうな気がしますがいかがでしょうか、、、

なお、usersテーブルに登録される内容をdd()で表示し、その内容を手動でusersテーブルに登録したところ、ログインは正常に機能していました。

編集追記1

作成されたマイグレーションファイルを無編集で使うとどうなるのか?っていうのを試すために、
php artisan make:migration create_testdata_table --create=testdataを実施し、
一切の手を加えずphp artisan migrateを実施したところ、一つ前に作成している"books"の
マイグレーションファイルはmigrationsに登録され、新規で作成した"testdata"分が未登録となりました。
どこかにマイグレーション対象数を持っている?
イメージ説明

編集追記2

MySQLに別名のデータベースを作成し、そちらに対しマイグレーションを実施しましたが、
結果としては編集追記1に記載した内容と同様となりました。

行った作業は以下になります。

(1) MySQLにrootユーザーでログイン
(2) データベース(laraveldb)の作成
CREATE DATABASE laraveldb CHARACTER SET utf8;
(3) test_userに全権限を付与 (test_userは既存ユーザー)
grant all on laraveldb.* to test_user;
(4) .envのDB接続情報を下記の通り修正

実際には"DB_DATABASE"を "laravel_testdb" → "laraveldb"に変更

DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laraveldb DB_USERNAME=test_user DB_PASSWORD=******

(5) laraveldbのテーブル数を確認

テーブル数=0
イメージ説明

(6) マイグレーション実施
php artisan migrate
→ エラー (DB接続先の変更が反映されていない模様)

SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'testdata' already exists (SQL: create table `testdata` (`id` bigint unsigned not null auto_increment primary key, `created_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')

(7) configのキャッシュクリア
php artisan config:clear

(8) マイグレーション実施
php artisan migrate
→ 成功

Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (1.49 seconds) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (1.2 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (0.71 seconds) Migrating: 2020_07_14_133344_create_books_table Migrated: 2020_07_14_133344_create_books_table (0.49 seconds) Migrating: 2020_07_15_012531_create_testdata_table Migrated: 2020_07_15_012531_create_testdata_table (0.79 seconds)

(9) テーブル登録情報確認
イメージ説明

(10) migrationsテーブル内容確認
→ testdataテーブルのマイグレーションファイルが未登録
イメージ説明

(11) マイグレーションステータス確認
php artisan migrate:status

+------+------------------------------------------------+-------+ | Ran? | Migration | Batch | +------+------------------------------------------------+-------+ | Yes | 2014_10_12_000000_create_users_table | 1 | | Yes | 2014_10_12_100000_create_password_resets_table | 1 | | Yes | 2019_08_19_000000_create_failed_jobs_table | 1 | | Yes | 2020_07_14_133344_create_books_table | 1 | | No | 2020_07_15_012531_create_testdata_table | | +------+------------------------------------------------+-------+

以上

編集追記3

上記で問題が発生しているLaravelプロジェクトですが、プロジェクト作成後は標準の認証機能
の導入など行っており、問題の切り分けを行う為に、一度、同じ手順(コマンド)で別のプロジェクトを作成しました。
しかし、結果としては同じ結果となりました。。

(1) Laravelプロジェクト作成
composer create-project laravel/laravel --prefer-dist BookManager

(2) .envのDB接続情報を設定

DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laraveldb DB_USERNAME=test_user DB_PASSWORD=******

(3) booksテーブルのマイグレーションファイル作成
php artisan make:migration create_books_table --create=books
<実行後>
イメージ説明

(4) マイグレーション実施
php artisan migrate
<実行後>
イメージ説明
イメージ説明
イメージ説明

以上

編集追記4

Laravelのバージョンを6.xでプロジェクトを作成してみましたが結果は同じでした。

composer create-project laravel/laravel=6.* --prefer-dist BookManager

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mix-peach

2020/07/15 02:10

「最後に実行されたSQL」だけが、ロールバックされている(コミットされていない) という印象ですね。。。 DB自体はどのように作成したのでしょうか?(DB作成のSQLをご提示いただけると何かわかるかもしれません) また、試しに新しいDBを作って、そちらに切り替えてみてmigrateなどを実行しても、現象は変わりませんか?
capyasutti

2020/07/15 02:25 編集

ご回答ありがとうございます。 MySQL自体は今回の作業でインストールしたわけではなく、 別のJavaアプリケーション作成時にインストールしています。 今回検証で使用しているデータベースは、既存のユーザー(test_user)でログインした上で、 下記SQLを用いて新規作成しています。 (WindowsPowerShellからCLIで実行) --実行SQL CREATE DATABASE laravel_testdb CHARACTER SET utf8; 別のDBを作成しての実施については、後ほど実施し、結果を再度投稿させていただきます。
capyasutti

2020/07/15 08:04

新しいDBを作成、切り替えした結果を編集追記2に記載しました
mix-peach

2020/07/15 23:45

確認ありがとうございます。 DBのcreate文はいたって普通ですね。 mysqlは以前インストールしたもの、とのことですが、その時何か変わった設定をしたとか・・そういう記憶は特にありませんか? あと念の為、DBで、SELECT @@autocommit; で、自動commitが有効になっているかを確認してみてください。 それから、laravelの標準には含まれていないライブラリ(特にDB関連のものとか)を導入していたりしますか?
capyasutti

2020/07/16 12:53 編集

MySQLも特に変わった設定をしたという記憶はないんです。。。 > あと念の為、DBで、SELECT @@autocommit; で、自動commitが有効になっているかを確認してみてください。 →確認したところ、0 (OFF)だったため、`set autocommit = 1`を実施し、再度`@@autocommit`で1 (ON)になっていることを確認しマイグレーションし直してみましたが変わらずでした。。。。 > laravelの標準には含まれていないライブラリ(特にDB関連のものとか)を導入していたりしますか? →これも特に入れた記憶は無いです。  composerを使用してLaravelプロジェクトを作成した後、上記も記載した通り認証機能を導入したことぐらいです。。
guest

回答2

0

MySQLの再セットアップにより解決しました。
MySQLの再セットアップ~稼働確認までは以下の手順で確認しています。

  1. MySQLセットアップ(+ユーザー作成)
  2. 追記編集4で作成したプロジェクトの.evnファイルを修正(ユーザー名など新たにしたため)
  3. Windows Power Shellより接続確認 → OK
  4. 追記編集4で作成したプロジェクト(Laravel 6.18.25)でマイグレーション実施

 → エラー (DBに接続できない旨表示)
5. Laravelプロジェクトからの接続ユーザーの認証方式を" mysql_native_password"に変更しパスワード再設定
→ Laravel 6.xだから"caching_sha2_password"に対応してない???
6. マイグレーション再実施
→ 成功!!
migrationsテーブルへの全ての登録を確認。
php artisan migrate:statusでも全ての”Run ?" が "yes"となっていることを確認

投稿2020/07/17 07:47

capyasutti

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

自動commitがOFFであること が原因で確定だと思います。(laravel側の問題ではない)

set autocommit = 1を実施し、再度@@autocommitで1 (ON)になっていることを確認しマイグレーションし直してみましたが変わらずでした。。。。

こちらですが、set autocommit = 1は、セッション単位での管理だと思いますので、
ターミナル等からこれを実行した後に、migrateをしても別セッションなので適用はされないです。。

mysqlの設定ファイル・・ my.cnf に、

init_connect='SET AUTOCOMMIT=0'

こんなのが書いてあったりしませんか?(バージョン差異で若干文言が違う可能性あり)

もし書いてあるならば、
ここを空に → mysqlを再起動 → migrateの再実行
で現象が解決しないでしょうか?

ちなみに。

mysqlは、自動コミットはデフォルトがONなので、
今のDBの状態は「過去にこのmysqlをインストールした方(過去のcapyasuttiさん?^^;)」が
あえてそうなるように「設定した」のだということになります。

となると、他にも「設定が変わっている部分」があるかもしれませんよね・・?

これでは、問題が発生するたびに、
laravelが悪いのか?DBが悪いのか?と原因を調査しなければならず、かなり手間です。。。

いっそ、mysqlサーバーを新たに用意し直した方がいいのかもしれないです。

投稿2020/07/17 00:55

mix-peach

総合スコア1910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

capyasutti

2020/07/17 01:43 編集

mix-peachさんご回答ありがとうございます。 私も、Laravelのプロジェクトも作り直したり、バージョン変えたり色々試して、Laravel側の問題ではない気がしたのでMySQL自体を一旦アンインストールし、再度セットアップしてました。 ですので、回答でアドバイス頂いたmysqlの設定ファイル(my.ini)の内容を変更して再実施というのは 試せてないのですが、MySQL側の問題で間違いなかったようで、 再セットアップにより問題が解決しました。 様々なアドバイスを頂けて心強かったです。 ご回答ありがとうございました!! なお、以下の手順でマイグレーションに成功したので記載しておきます 1. MySQLセットアップ(+ユーザー作成) 2. 追記編集4で作成したプロジェクトの.evnファイルを修正(ユーザー名など新たにしたため) 3. Windows Power Shellより接続確認 → OK 4. 追記編集4で作成したプロジェクト(Laravel 6.18.25)でマイグレーション実施  → エラー (DBに接続できない旨表示) 5. Laravelプロジェクトからの接続ユーザーの認証方式を" mysql_native_password"に変更しパスワード再設定  → Laravel 6.xだから"caching_sha2_password"に対応してない??? 6. マイグレーション再実施  → 成功!!   migrationsテーブルへの全ての登録を確認。   `php artisan migrate:status`でも全ての”Run ?" が "yes"となっていることを確認
mix-peach

2020/07/17 05:11

解決されたのであればよかったです! あ。ベストアンサーを頂いておいて恐縮ですが、 今回の場合「私の回答=解決方法」ではないので、↑に書いていただいた手順を「自己解決」としてのせられた方が良いかもです。(お手間で無ければ^^)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問