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

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

ただいまの
回答率

90.33%

【laravel:質問形式のアプリケーション】1つの質問に対して複数の回答を受け付けられるようにしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 80

190celery

score 1

独学でLaravelを勉強している者です。
まだまだ知識が浅く、見当外れなことをしているかもしれません。
ご多忙の中大変恐縮ですが、何卒宜しくお願い致します。

実現したいこと

実現したいこととしては、質問に対して複数の回答を登録できる形式のアプリケーションを作っています。
具体的には、ユーザーが作りたい料理をオーダーして、
第三者がそのオーダーに沿ったレシピを投稿するという内容です。
質問に対して複数の回答を登録できるようにControllerで保存したいのですが、
どのようにしたら宜しいでしょうか。
どなたかおわかりになる方がおられましたらご教示ください。

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

SQLSTATE[HY000]: General error: 1364 Field 'order_id' doesn't have a default value (SQL: insert into recipes (ingredienttitleportionhow_to_1how_to_2how_to_3how_to_4how_to_5how_to_6how_to_7how_to_8how_to_9how_to_10how_to_11how_to_12one_pointuser_idupdated_atcreated_at)

Migration(Recipe)

class CreateRecipeTable extends Migration
{

public function up()
{
Schema::create('recipes', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned()->index();
$table->integer('order_id')->unsigned()->index();
$table->string('ingredient');
$table->string('title');
$table->string('portion');
$table->string('how_to_1');
$table->string('how_to_2')->nullable();
$table->string('how_to_3')->nullable();
$table->string('how_to_4')->nullable();
$table->string('how_to_5')->nullable();
$table->string('how_to_6')->nullable();
$table->string('how_to_7')->nullable();
$table->string('how_to_8')->nullable();
$table->string('how_to_9')->nullable();
$table->string('how_to_10')->nullable();
$table->string('how_to_11')->nullable();
$table->string('how_to_12')->nullable();
$table->string('one_point')->nullable();
$table->timestamps();

$table->foreign('user_id')->references('id')->on('users');
$table->foreign('order_id')->references('id')->on('orders');
});
}

public function down()
{
Schema::dropIfExists('recipes');
}
}

Migration(Order)

class CreateOrderTable extends Migration
{

public function up()
{
Schema::create('orders', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned()->index();
$table->string('ingredient');
$table->string('capability');
$table->string('outline');
$table->string('details');
$table->timestamps();

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

public function down()
{
Schema::dropIfExists('orders');
}
}

Controller

$request:回答内容が格納されています
$id:回答したい "order(=質問)" の id が格納されています
recipes()return $this->hasMany(Recipe::class);を返してます


public function store(Request $request,$id){

$request->user()->recipes()->create([
"ingredient" => $request->ingredient,
'title' => $request->title, 
'portion' => $request->portion,
'how_to_1' => $request->how_to_1,
'how_to_2' => $request->how_to_2,
'how_to_3' => $request->how_to_3,
'how_to_4' => $request->how_to_4,
'how_to_5' => $request->how_to_5,
'how_to_6' => $request->how_to_6,
'how_to_7' => $request->how_to_7,
'how_to_8' => $request->how_to_8,
'how_to_9' => $request->how_to_9,
'how_to_10' => $request->how_to_10,
'how_to_11' => $request->how_to_11,
'how_to_12' => $request->how_to_12,
'one_point' => $request->one_point,
]);

$order=Order::find($id);

$order->recipes()->create([
"ingredient" => $request->ingredient,
'title' => $request->title, 
'portion' => $request->portion,
'how_to_1' => $request->how_to_1,
'how_to_2' => $request->how_to_2,
'how_to_3' => $request->how_to_3,
'how_to_4' => $request->how_to_4,
'how_to_5' => $request->how_to_5,
'how_to_6' => $request->how_to_6,
'how_to_7' => $request->how_to_7,
'how_to_8' => $request->how_to_8,
'how_to_9' => $request->how_to_9,
'how_to_10' => $request->how_to_10,
'how_to_11' => $request->how_to_11,
'how_to_12' => $request->how_to_12,
'one_point' => $request->one_point,
]);

return view("welcome");
}

試したこと

user(1)に対して order(=質問)(多)の関係
user(1)に対して recipe(=回答)(多)の関係
order(=質問)(1)に対して recipe(=回答)(多)の関係にて構築しようと思っております。
よって、orderとrecipeにはuserを識別するuser_idを設けており、
recipeにはorderを識別するorder_idを設けております。
ただ、order_idが NOT NULLが付与されているため、デフォルト値がないというエラーが起こります。

便宜的に
$request->user()->recipes()->create([
"ingredient" => $request->ingredient,
//途中省略//,
'order_id' => 1,
]);

と入力してみてもエラーは解消されず、
また次はMigration(Recipe)を$table->integer('order_id')->unsigned()->index()->nullable;と変更すると
user_idにデフォルト値がないというエラーが出ます。

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

Laravel5.5

最後に

わかりづらい質問大変申し訳ございません。
お手数おかけしますがご教示いただければと存じます。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

よって、orderとrecipeにはuserを識別するuser_idを設けており、
recipeにはorderを識別するorder_idを設けております。
ただ、order_idが NOT NULLが付与されているため、デフォルト値がないというエラーが起こります。

ここだけ読むなら

recipeにuser_idがなければ素直に保存できるのでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/15 14:06

    ありがとうございます。
    アドバイスどおりに修正しましたら直りました。

    キャンセル

  • 2019/08/15 18:42

    recipeからuser_idが必要な場合は、order経由で取れるはず。と正規化していくとこのような問題を防げます。
    (recipeにuser_idがある事で検索速度が向上する、というのは一理あるしあえて正規化しない場合もあるのでこの限りでは有りませんが)

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • 【laravel:質問形式のアプリケーション】1つの質問に対して複数の回答を受け付けられるようにしたい