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

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

新規登録して質問してみよう
ただいま回答率
85.49%
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回答

1338閲覧

Laravel 1対多のデータの挿入の仕方

mikeross

総合スコア18

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クリップ

投稿2019/05/02 07:53

こんにちは。

表題について質問があります。

以下のソースコードでフォームから飛ばしてきた値をデータベースに格納を試みているのですがうまくいきません。

つまづいているポイントとしては、コントローラーの$customer_jobs = $customer->jobs;でJobテーブルのインスタンスが取得できないところです。
他の1対1のモデル同士の時はうまくモデル(テーブル)インスタンスを取得ができたのですが、
1対多の場合は以下のソースではCollectionインスタンスが返ってきてしまい、fill()などが利用できません。

色々とググってみたのですが、なぜかこのポイントだけ説明しているサイトが見つからず行き詰ってしまいました。
わかる方ご教授いただければと思います。

環境

  • laravel5
  • 1対多 = Customer : Job

php

1class Customer extends Authenticatable 2{ 3 4 # ...略 5 6 public function jobs() 7 { 8 return $this->hasMany( 'App\Models\Job' ); 9 } 10}

php

1class Job extends Model 2{ 3 4 # ...略 5 6 public function user() 7 { 8 return $this->belongsTo( 'App\Models\Customer' ); 9 } 10} 11

php

1public function create( Request $request ) 2 { 3 4 DB::beginTransaction(); 5 6 try{ 7 8 $user = Auth::user(); 9 10 $customer = Customer::find( $user->id ); 11 $customer_jobs = $customer->jobs; 12 $form = $request->all(); 13 unset( $form["_token"] ); 14 15 # $customer_jobsの中はCollectionインスタンスでfill()が使えない 16 if( $customer_jobs ){ 17 $customer_jobs->fill( $form )->save(); 18 } else { 19 $customer->jobs()->create( $form ); 20 } 21 22 } catch( Exception $e ){ 23 DB::rollBack(); 24 25 return back()->withInput(); 26 } 27 28 DB::commit(); 29 30 return redirect()->route( 'customer.home' ); 31 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

すぐ下と同じように$customer->jobs()なのでは。

目的からするとupdateOrCreate一つでよさそう。

$customer->jobs()->updateOrCreate([], $form );

リレーションは複雑だから暗記する必要はないけど常にドキュメントの確認は必要。
https://readouble.com/laravel/5.8/ja/eloquent-relationships.html#the-save-method

投稿2019/05/02 08:29

kawax

総合スコア10377

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

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

mikeross

2019/05/02 08:53

ありがとうございます。完璧です。 いただいたURLも確認はしたのですが、ピンときていなかったのでまだまだ知識不足です。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問