回答編集履歴

1

コメントを受けて回答追加。

2018/04/03 04:58

投稿

nak
nak

スコア696

test CHANGED
@@ -33,3 +33,105 @@
33
33
  https://readouble.com/laravel/5.3/ja/migrations.html
34
34
 
35
35
  の「外部キー制約」の項を参照してください。
36
+
37
+
38
+
39
+ --
40
+
41
+
42
+
43
+ コメントをうけて追記。
44
+
45
+
46
+
47
+ > 調べてみると親テーブルができていない状態で実行した場合などに出るエラーなのですが
48
+
49
+
50
+
51
+ そうではないと思います。
52
+
53
+ 落ち着いて、エラーメッセージを1行ずつ読んでみましょう(エラーが起きた時は、エラーメッセージやエラーコードにだいたい重要な情報が書いてあります)。
54
+
55
+
56
+
57
+ `SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;`
58
+
59
+ ⇒こちら、超意訳をすると「SQLの構文が間違っている」となります。
60
+
61
+
62
+
63
+ `check the manual that corresponds to your MySQL server version for the right syntax to use near ') on delete cascade' at line 1`
64
+
65
+ ⇒「') on delete cascade'の近くがおかしいよ」となります。
66
+
67
+
68
+
69
+ > (SQL: alter table `reservation_calender` add constraint `reservation_calender_
70
+
71
+ teacher_id_foreign` foreign key (`teacher_id`) references `teachers` () on
72
+
73
+ delete cascade)
74
+
75
+
76
+
77
+ ⇒') on delete cascade'の近くを見てみると
78
+
79
+ 直前:references `teachers` ()
80
+
81
+ 直後:)
82
+
83
+ となっています。
84
+
85
+ ⇒直前の `teachers` () の部分がおかしいですね(本来、外部キーを指定しなければならないカッコの中が空になっています)。
86
+
87
+
88
+
89
+ ここで、teachersの外部キーを指定しているLaravel側のコードを見てみます。
90
+
91
+
92
+
93
+ > $table->foreign('teacher_id')
94
+
95
+ > ->reference('id')->on('teachers')
96
+
97
+ > ->onDelete('cascade');
98
+
99
+
100
+
101
+ ⇒「reference」のところで外部キーを指定しているつもりなのに、なぜか空になっている、ということがわかります。
102
+
103
+
104
+
105
+ というわけで、改めて、マニュアルを見に行ってみます。
106
+
107
+
108
+
109
+ https://readouble.com/laravel/5.5/ja/migrations.html
110
+
111
+ の「外部キー制約」の項(一応、マニュアルのバージョンを5.5に変えてみました)
112
+
113
+
114
+
115
+ ⇒サンプルコードが
116
+
117
+
118
+
119
+ > $table->foreign('user_id')
120
+
121
+ > ->references('id')->on('users')
122
+
123
+ > ->onDelete('cascade');
124
+
125
+
126
+
127
+ となっています。
128
+
129
+
130
+
131
+ よく見比べてみると、マニュアルの外部キー指定部分は `references('id')` となっています(reference
132
+
133
+ ではなく。末尾の"s"の有無が異なります)。
134
+
135
+
136
+
137
+ というわけで、コード中の `reference` を `references` に直していただくと、2つめのエラーは解消すると思われます。