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

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

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

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

Laravel 5

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

Q&A

解決済

2回答

519閲覧

Laravel 5.8で主キー、外部キーの設定に関する問題

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

Laravel 5

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

0グッド

0クリップ

投稿2019/05/08 09:15

前提・実現したいこと

Laravel5.8を使用して、ニュース記事、それに意見を投稿するYahooニュースのようなWebサイトを作りたいです。

ニュース記事(article)に、意見(post)をforeignキーで関連づけていけるようにしたいのですが、
ニュース記事に対しての投稿がテスト投稿でうまくいきません。

idは
articles Tableの方に主キーidと、
posts Tableの方にid, article_id, user_id(user_idは後ほど関連づける予定)、その他をつけています

エラーメッセージの指摘通り、
article_idとuser_idはnot nullにはせず、主キーと同じく自動連番でつけたいと考えています。

初心者質問で申し訳ありませんが、どなたかご教示いただけませんでしょうか。

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

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'article_id' cannot be null (SQL: insert into `posts` (`content`, `article_id`, `user_id`, `updated_at`, `created_at`) values (てすと, ?, ?, 2019-05-08 17:39:50, 2019-05-08 17:39:50))

PHP Laravel  articles Table

<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateAirticlesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('articles', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('content'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('articles'); } }

posts table

<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreatePostsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->integer('article_id')->unsigned(); $table->integer('user_id')->unsigned(); $table->text('content'); $table->timestamps(); $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade'); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('posts'); } }

Article model

<?php namespace App; use Illuminate\Database\Eloquent\Model; use App\Post; class Article extends Model { protected $fillable=[ 'title','content' ]; public function posts(){ return $this->hasMany('App\Post'); } }

###Post Model

<?php namespace App; use Illuminate\Database\Eloquent\Model; use App\Article; class Post extends Model { protected $fillable = [ 'article_id','user_id','content' ]; public function articles(){ return $this->belongsTo('App\Article'); } }

試したこと

テスト投稿する前に、Seederを使ってテストデータを挿入しようとしたのですが、
General error: 1364 Field ‘article_id’ doesn’t have a default value
とエラーが出てきて、データが挿入できず、手入力を試してみました。

MigrationのTableの設定ができていないのではないかと思いますが、何が悪いのかどうしてもわかりません。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Post生成時にarticle_idが必要。

$article = Article::create([ 'title' => 'title', 'content' => 'content', ]);

分かりやすく書くならこういうこと。

$post = Post::create([ 'article_id' => $article->id, 'user_id' => auth()->id(), 'content' => 'content', ]);

これならarticle_idは自動設定。

$post = $article->posts()->create([ 'user_id' => auth()->id(), 'content' => 'content', ]);

投稿2019/05/08 09:46

kawax

総合スコア10377

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

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

退会済みユーザー

退会済みユーザー

2019/05/08 10:50

ご返答ありがとうございます。 基礎学習がしっかりできていませんでした。。勉強し直した上で、こちらの方法も試してみます。
guest

0

たぶんマイグレーションは悪くないです。

Column 'article_id' cannot be null

not null制約に引っかかっているということはnullの値を入れようとしていると思われます。

Seederを使ってテストデータを挿入

初心者がいきなりSeederに手を出すのは横着です。
RDBやモデル操作にある程度慣れてから挑戦してみましょう。

まずは、

php artisan tinker

でLaravelのREPL開けますので、そこで、

// ユーザを取得(事前に作っておくこと) $user = User::first(); // 記事作成 $article = new Article(); $article->title = 'タイトル'; $article->content = '内容'; $article->save(); // コメント作成 $post = new Post(); $post->content = '内容'; $post->article_id = $article->id; $post->user_id = $user->id; $post->save();

のように愚直にレコード作成してエラーが出るか検証してみてはいかがでしょうか。

投稿2019/05/08 09:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/05/08 10:39

ご返答ありがとうございます。 確かに横着でした。。ご指摘ありがとうございます! まだ理解が進んでいないので、データ挿入も愚直にやってみます。
退会済みユーザー

退会済みユーザー

2019/05/08 11:00

はい、ボトムアップでひとつひとつおさえていくことが大事ですよ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問