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

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

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

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

artisan

artisanは、PHP Laravelフレームワークのコマンドの事です。 Artisanコマンドを使う事で、DBのテーブルやバンドル等を追加することができるコマンドです。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

6839閲覧

laravel5.5 migrate実行後、文字コードのエラー

kazoogon

総合スコア281

PHP

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

artisan

artisanは、PHP Laravelフレームワークのコマンドの事です。 Artisanコマンドを使う事で、DBのテーブルやバンドル等を追加することができるコマンドです。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2018/04/03 03:25

Laravel5.5 homesteadを使用した開発にてただいま外部キーの設定をしております。こちらがmigrateのファイルの一部です、すでにテーブルにカラムは存在し、外部キーを設定するだけです。

public function up() { Schema::create('reservation_calender', function (Blueprint $table) { $table->foreign('teacher_id') ->reference('id')->on('teachers') ->onDelete('cascade'); $table->foreign('student_id') ->reference('id')->on('students') ->onDelete('cascade'); }); }

しかしphp artisan migrate実行後

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error i n your SQL syntax; check the manual that corresponds to your MySQL server v ersion for the right syntax to use near ') default character set utf8mb4 co llate utf8mb4_unicode_ci' at line 1 (SQL: create table `reservation_calende r` () default character set utf8mb4 collate utf8mb4_unicode_ci)

とのエラーが出てきます。mysqlでの文字コードをしらべてみると下記の通りでした

+--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+

その後/etc/my.cnfにて以下を追加(もともとは中身のないファイルでした)

[mysqld] aracter-set-server=utf8mb4 [client] default-character-set=utf8mb4

そして「sudo service mysql restart」でmysqlサーバ再起動させましたが、文字コードに変化がなくここから先に進めない状態となっております。
ご回答よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

文字コードに対する指摘ではないのですが

すでにテーブルにカラムは存在し、外部キーを設定するだけです。

と書かれているのに、

Schema::create('reservation_calender', function (Blueprint $table) {

は矛盾していると思われます( Schema::create() はテーブル作成時に使用する構文です)。

そのため、まずは create の部分を table に変更してみてはどうでしょう?(Schema::create()Schema::table()

参考:
https://readouble.com/laravel/5.3/ja/migrations.html
の「外部キー制約」の項を参照してください。

--

コメントをうけて追記。

調べてみると親テーブルができていない状態で実行した場合などに出るエラーなのですが

そうではないと思います。
落ち着いて、エラーメッセージを1行ずつ読んでみましょう(エラーが起きた時は、エラーメッセージやエラーコードにだいたい重要な情報が書いてあります)。

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;
⇒こちら、超意訳をすると「SQLの構文が間違っている」となります。

check the manual that corresponds to your MySQL server version for the right syntax to use near ') on delete cascade' at line 1
⇒「') on delete cascade'の近くがおかしいよ」となります。

(SQL: alter table reservation_calender add constraint `reservation_calender_

teacher_id_foreign foreign key (teacher_id) references teachers` () on
delete cascade)

⇒') on delete cascade'の近くを見てみると
直前:references teachers ()
直後:)
となっています。
⇒直前の teachers () の部分がおかしいですね(本来、外部キーを指定しなければならないカッコの中が空になっています)。

ここで、teachersの外部キーを指定しているLaravel側のコードを見てみます。

$table->foreign('teacher_id') ->reference('id')->on('teachers') ->onDelete('cascade');

⇒「reference」のところで外部キーを指定しているつもりなのに、なぜか空になっている、ということがわかります。

というわけで、改めて、マニュアルを見に行ってみます。

https://readouble.com/laravel/5.5/ja/migrations.html
の「外部キー制約」の項(一応、マニュアルのバージョンを5.5に変えてみました)

⇒サンプルコードが

$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');

となっています。

よく見比べてみると、マニュアルの外部キー指定部分は references('id') となっています(reference
ではなく。末尾の"s"の有無が異なります)。

というわけで、コード中の referencereferences に直していただくと、2つめのエラーは解消すると思われます。

投稿2018/04/03 03:54

編集2018/04/03 04:58
nak

総合スコア696

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

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

kazoogon

2018/04/03 04:31

回答ありがとうございます。ご指摘の通りcreateではなくtableが正しいです。 修正後migrate実行すると ``` SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error i n your SQL syntax; check the manual that corresponds to your MySQL server v ersion for the right syntax to use near ') on delete cascade' at line 1 (SQ L: alter table `reservation_calender` add constraint `reservation_calender_ teacher_id_foreign` foreign key (`teacher_id`) references `teachers` () on delete cascade) ``` のエラーが出ました、調べてみると親テーブルができていない状態で実行した場合などに出るエラーなのですが、ここではすでに親テーブルは存在しているのに。。。 という状態です。。
kazoogon

2018/04/03 05:44

referencesの件とても参考になりました。 エラー文の「references teachers () 」の()が空になっているというエラー文の見方は今までできていなかったので非常に助かりました、今後にも生かせそうです、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問