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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

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

PHP

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

Q&A

解決済

1回答

1145閲覧

Laravel hypertextcandy チュートリアル第8章 useridの紐付け

revoiot

総合スコア188

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

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

PHP

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

0グッド

0クリップ

投稿2020/09/16 10:53

編集2020/09/22 13:36

前提・実現したいこと

前提
Hypercandytextのチュートリアルを参考にlaravelでTodo webアプリを書かれているコードを貼り付けながら、作成して勉強をしています。
参考にしているチュートリアルでは、PostgresSQLを使用することが前提として書かれていますが、私はMySQlを使用しています。

実現したい事
テーブルでユーザーとフォルダを結びつけた仕様にして、
フォルダを作成をしたいのですが、下記のようにエラーが発生してしまう状況です。

発生している問題・エラーメッセージ

エラー内容の詳細リンク

イメージ説明

該当のソースコード

FolderController.php

public function create(CreateFolder $request) { // フォルダモデルのインスタンスを作成する $folder = new Folder(); // タイトルに入力値を代入する $folder->title = $request->title; // インスタンスの状態をデータベースに書き込む $folder->save(); return redirect()->route('tasks.index', [ 'id' => $folder->id, ]); } }

2020_09_14_133252_add_user_id_to_folders.php

public function up() { Schema::table('folders', function (Blueprint $table) { $table->bigInteger('user_id')->unsigned(); // 外部キーを設定する $table->foreign('user_id')->references('id')->on('users'); }); }

FoldersTableSeeder.php

<?php use Carbon\Carbon; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; class FoldersTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { $user = DB::table('users')->first(); // ★ $titles = ['プライベート', '仕事', '旅行']; foreach ($titles as $title) { DB::table('folders')->insert([ 'title' => $title, 'user_id' => $user->id, // ★ 'created_at' => Carbon::now(), 'updated_at' => Carbon::now(), ]); } } }

試したこと

URLの内容を参考に、'strict' => falseに変更
→下記のようにエラーが発生。

error

1SQLSTATE[2300]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`test2`.`folders`, CONSTRAINT `folders_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)) (SQL: insert into `folders` (`title`, `updated_at`, `created_at`) values (ccd, 2020-09-16 09:51:48, 2020-09-16 09:51:48))

このエラー詳細リンク

②マイグレーションファイルに記述のinteger, incrementsをbigIncrements,bigIntegerに変更

→特にエラーは消えず。

③2020_09_14_133252_add_user_id_to_folders.phpのファイルの中のuserIDの定義にデフォルト値として、1を追加。

$table->bigInteger('user_id')->unsigned()->default(1);

→下記のようにエラーが発生。

error

1SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`test2`.`folders`, CONSTRAINT `folders_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)) (SQL: insert into `folders` (`title`, `updated_at`, `created_at`) values (ccd, 2020-09-16 10:28:01, 2020-09-16 10:28:01))

このエラー詳細リンク

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

Laravel Framework 7.25.0

MySQL 8.0.21 Homebrew

PHP 7.4.8 (cli)

もし上記に記載されているコードのみで不足がある場合のため、私が書いたコードのGithubリンクを記載させていただきます。

参考にしたチュートリアルのURL
https://www.hypertextcandy.com/laravel-tutorial-authentication

mysql

1SHOW CREATE TABLE test2.users 2-------------- 3| Table | Create Table 4| users | CREATE TABLE `users` ( 5 `id` bigint unsigned NOT NULL AUTO_INCREMENT, 6 `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, 7 `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, 8 `email_verified_at` timestamp NULL DEFAULT NULL, 9 `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, 10 `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 11 `created_at` timestamp NULL DEFAULT NULL, 12 `updated_at` timestamp NULL DEFAULT NULL, 13 PRIMARY KEY (`id`), 14 UNIQUE KEY `users_email_unique` (`email`) 15) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | 16

mysql

1SHOW CREATE TABLE test2.folders 2-------------- 3| Table | Create Table 4| folders | CREATE TABLE `folders` ( 5 `id` bigint unsigned NOT NULL AUTO_INCREMENT, 6 `title` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL, 7 `created_at` timestamp NULL DEFAULT NULL, 8 `updated_at` timestamp NULL DEFAULT NULL, 9 `user_id` bigint unsigned NOT NULL, 10 PRIMARY KEY (`id`), 11 KEY `folders_user_id_foreign` (`user_id`), 12 CONSTRAINT `folders_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) 13) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | 14

mysql

1SHOW CREATE TABLE test2.tasks 2-------------- 3| Table | Create Table 4| tasks | CREATE TABLE `tasks` ( 5 `id` bigint unsigned NOT NULL AUTO_INCREMENT, 6 `folder_id` bigint unsigned NOT NULL, 7 `title` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, 8 `due_date` date NOT NULL, 9 `status` int NOT NULL DEFAULT '1', 10 `created_at` timestamp NULL DEFAULT NULL, 11 `updated_at` timestamp NULL DEFAULT NULL, 12 PRIMARY KEY (`id`), 13 KEY `tasks_folder_id_foreign` (`folder_id`), 14 CONSTRAINT `tasks_folder_id_foreign` FOREIGN KEY (`folder_id`) REFERENCES `folders` (`id`) 15) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | 16

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

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

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

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

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

yuki84web

2020/09/16 13:00

初期値を設定していない&NULLを許容しないカラムがあるのに、そこに何もセットせずにレコードを作成だか更新しようとしてエラーになっているようなので、適切なユーザーのIDをセットしてあげるだけではないでしょうか。そうなるとdefault(1)というのも不要です。
hentaiman

2020/09/16 13:00

エラー表示されてるSQLは直接mysqlciientから実行する事はできたんですか?
revoiot

2020/09/16 13:05

>yuki84webさん ご回答いただきありがとうございます。 大変恐れ入りますが、適切なユーザーIDをどう設定できるのかご教示頂けると幸いです、、、
revoiot

2020/09/16 13:12

>hentaiman さん まだ私はプログラミング初心者でわからない事が多く、質問させて頂けると幸いなのですが、 mysqlclientでSQLを実行することによって、どういったことを確認可能なのでしょうか?
hentaiman

2020/09/16 13:18

SQLがおかしいのかプログラムがおかしいのかの切り分けが出来ます。 SQLがおかしいと分かったら次に直接SQL修正して、正しいSQL(元のSQLの誤っている箇所)が分かったら、正しいSQLを作れるようにプログラム側を直します。 それでもエラーになる場合は、プログラム側の別の個所がおかしいと分かるので修正します。 という順で辿る為です。そしてこれはデバッグの基本です。 ただ今回のエラーに限っては見れば分かる感じなのと、SQLを直接実行する事で気付けるんじゃないかと思ってのアドバイスです。
revoiot

2020/09/17 03:07

>hentaiman さん 大変親切にわかりやすく説明してくださりありがとうございます。 エラーメッセージ内に含まれるこのSQL文をクライアントに貼り付けて実行したところ、 insert into `folders` (`title`, `updated_at`, `created_at`) values (ccd, 2020-09-16 10:28:01, 2020-09-16 10:28:01) 下記のように、「SQL文の記法に誤りがあるので、自分が持っているMySQLのバージョンに対応した記法で書き直してほしい」というエラーが発生しました。 SQL Error [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '09:51:48, 2020-09-16 09:51:48)' at line 1 このエラーがでてしまうということは、私が使用しているLaravelバージョンに対するMySQLのバージョンに問題があるという認識で合っていますでしょうか?
hentaiman

2020/09/17 03:39

foldersのテーブル定義(show create table folders)が載ってないのでエラーの理由は分かりませんが、大抵はただのSQLミスです。 日付部分をシングルクォートで括るとか簡単に試せること試して、ダメなら1から正しいinsert文を組み立てて通る場合と通らない場合で比較しましょう。 あとエラーとは関係無いけどdefautl 1はやめたら?もしパラメーターの設定ミスってたら勝手にuser_id 1の人が使われちゃう事になりますよ。
revoiot

2020/09/17 05:35

>hentaiman さん 大変親切に説明していただきありがとうございます。 hentaiman さんのおっしゃる通り、SQLミスでした。 下記のように書き換えて、実行したところ、 insert into folders (title, updated_at, created_at) values ('ccd', '2020-09-16 10:28:01', '2020-09-16 10:28:01'); Laravelのものと全く同じエラーメッセージが表示されました。 SQL Error [1364] [HY000]: Field 'user_id' doesn't have a default value >あとエラーとは関係無いけどdefautl 1はやめたら?もしパラメーターの設定ミスってたら勝手にuser_id 1の人が使われちゃう事になりますよ。 おっしゃる通りですね、、、defautl 1は削除させていただきました。
hentaiman

2020/09/17 07:11

そしたらやっと正しいSQL組むテストに入れますね。エラーを翻訳にでも掛けて理解し、正しいSQLを組んでみましょう。その際のvalueは全部ダミーでOKです。 エラーが発生したSQLやその値に拘らないで自分で組み立てるのがコツです。この値通るはずなのにという思い込みの下で試したら先ほどのエラーと同じように疑惑を持たない可能性があるからです。
revoiot

2020/09/17 13:10

>hentaiman さん 詳しく教えていただきありがとうございます。 SQL Error [1364] [HY000]: Field 'user_id' doesn't have a default value というエラーが発生したため、use_idのデフォルト値を設定してあげればいいと考えたのですが、デフォルト値を設定してもエラーが発生してしまったんですよね、、、、 こういう場合どうやって解決していけば良いのか解説していただけると幸いです、、、、
yuki84web

2020/09/17 13:25

「適切なユーザーIDをどう設定できるのか」→処理の書き方としてはcreateメソッドでタイトルをセットしている所と同じ書き方でしょう。そもそも必ず値をセットすることが前提なら初期値を設定する必要は無いです。初期値ありでセットし忘れて「意図せず本来のユーザーとは違うIDで紐づいてしまった」ということが起こりますが、それは困りますよね。
hentaiman

2020/09/17 14:25

既に書いた通りテーブル定義が無いので正確なエラー理由は分からないので適切なアドバイスは出来ません。載せられる情報は全部載せてください。
revoiot

2020/09/17 15:13

>yuki84webさん 大変親切に説明していただき、ありがとうございます。 おっしゃる通り、値が入ってくる事が前提なのに、デフォルト値を設定する必要はないですよね、、 値がちゃんと入ってくるようにするために、どうするべきなのか考えるべきでした。。。。
revoiot

2020/09/17 15:15

>hentaiman さん さきほど、投稿を編集し、テーブル定義の内容を追加させていただきました。 大変恐縮ですが、確認後アドバイスをいただけると幸いです、、、
guest

回答1

0

ベストアンサー

エラーのSQLは

insert into folders (title, updated_at, created_at) values ('ccd', '2020-09-16 10:28:01', '2020-09-16 10:28:01');

それに対してテーブル定義は

`id` bigint unsigned NOT NULL AUTO_INCREMENT, `title` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, `user_id` bigint unsigned NOT NULL,

user_idをnot nullにしておきながら、insert文からは漏れています。
それに対してエラー文は

'user_id' doesn't have a default value

つまりこのエラー文が本当に言いたいのはinsertするならuser_id入れろって事です

投稿2020/09/17 18:22

hentaiman

総合スコア6426

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

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

revoiot

2020/09/17 23:26 編集

回答していただき誠にありがとうございます。 回答者様のおっしゃる通り、insertする際にuser_idを入れればいいのですが、下記のコードでインサートされるように記述されているにもかかわらず、同じエラーがでる状況です。 (ユーザーテーブルにデータは入っています。) Laravelの方では、FoldersTableSeeder.phpの内容からuser_idがインサートされるように、 public function run() { $user = DB::table('users')->first(); // ★ $titles = ['プライベート', '仕事', '旅行']; foreach ($titles as $title) { DB::table('folders')->insert([ 'title' => $title, 'user_id' => $user->id, // ★ 'created_at' => Carbon::now(), 'updated_at' => Carbon::now(), ]); } } の星マーク部分で指定されていて、 ユーザーテーブルが最初の1行を取得して、userという変数を介して、フォルダテーブルのインサートしています。 上記のコードもチュートリアルからそのままコピペしたものですが、同じエラーが発生してしまいました。 チュートリアルの著者がPostgessqlを使用することを前提に解説しているのにもかかわらず、私がMySQLを使用しているためにこのようなエラーが発生してしまうのでしょうか? それとも、MySQLのバージョンによるものでしょうか? 何回も質問してしまい、大変恐れ入りますが、アドバイスの方をいただけると幸いです。 ※投稿時に、FoldersTableSeeder.phpを投稿内容に追記するのを失念しておりました、、、 大変申し訳ございません、、 確認していただけると幸いです。
hentaiman

2020/09/18 01:34

アドバイスはもう既にしている通り、おかしいと思ったらデバッグしてください。 あるはずのidが無いのならidがあるかどうかをログなどに出力して確認ましょう。列が指定出来ないのならなぜ出来ないのかを遡って確認しましょう。 チュートリアルの事は全く知りませんけど、その不具合を検索して情報が出てくるならチュートリアルが間違ってるので直しましょう。出てこないなら質問者さんのミスでしょう。 提示のソースだけでは原因は分かりません(コメントで書いた通り予想しかできない)が、さすがにそこまで見る気はないのでちゃんと自分のソースをチュートリアルを見比べてください。また、チュートリアルに書いてあるであろうコードの説明をよく読んで理解してください。 理解すれば、質問の為に提示が必要なコードも分かるはずです。 > チュートリアルの著者がPostgessqlを使用することを前提に解説しているのにもかかわらず、私がMySQLを使用しているためにこのようなエラーが発生してしまうのでしょうか? それは知りません。関係無さそうに見えるけどその疑念が湧いたのならpostgres環境用意して試してください。
revoiot

2020/09/22 01:53 編集

大変親切にご教示いただきありがとうございます。 Laravelでのデバッグについてネット検索したところ、dd()、var_dump()などいろんなデバック方法があり.デバッグしてデータの中身を確認する事ができました。 postgres環境でも同じコードで検証した結果、 SQLSTATE[23502]: Not null violation: 7 ERROR: null value in column "user_id" violates not-null constraint DETAIL: Failing row contains (26, vf, 2020-09-22 01:11:02, 2020-09-22 01:11:02, null). (SQL: insert into "folders" ("title", "updated_at", "created_at") values (vf, 2020-09-22 01:11:02, 2020-09-22 01:11:02) returning "id") というエラーメッセージが表示され、MySQLの時と少しメッセージ内容は異なりますが、 user_idにちゃんと値が入っていないことがエラー内容から確認できました。 疑念が湧いたら試してみるというアドバイスをいただきありがとうございます。
revoiot

2020/09/22 02:43

デバッグしても,環境を変えても、  user_idをどうやって挿入したらいいかわからず、 エラーが解消ができない状況です。。。。。
hentaiman

2020/09/22 02:57

なんじゃそら 何回も言ってるけどソース提示不足で分かりません。(なんでもかんでも全部貼ってあるよりマシだが、もう少しデバッグ頑張って当たりをつけましょう) 質問見て分かる事はFolderController.phpのどこでuser_id指定しとんねんって事ぐらいです。(他にもありそうだが) この指摘でデバッグ個所に見当つかないようなら多分チュートリアルを最初からやり直した方が良いです。きっと理解漏れている場所があるはずだから。 ※チュートリアルの品質が悪ければ位知りません。
revoiot

2020/09/22 13:30

heitaimanさんのおっしゃる通り、 folder contollerでuseridの紐付けをしていないことが原因でした。 下記のコードを追加したところ、エラー出ることなく、正常にフォルダ作成することができるようになりました。 $user = User::first(); // 最初のレコードを取得 $folder->user_id = $user->id; //ユーザーテーブルのuseridとuserテーブルのidの紐付け 参考資料 https://teratail.com/questions/188366 何度も親切に説明してくださりありがとうございました。 教えていただいたデバック方法を、これからも実践していきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問