🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

Laravel

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

1回答

596閲覧

複数のテーブルを外部キーで繋いで登録したい

ttt---aaa

総合スコア21

MySQL

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

Laravel

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2021/02/06 00:59

編集2021/02/06 05:30

やりたいこと

複数のテーブルを外部キーで紐づき、一度のPOSTでDBに登録したいのですが、方法が見出せずにいますので是非アドバイスをお願いいたします。
イメージ説明
現状としては、employeeテーブルとgoodsテーブルの情報を「社員登録する」で登録はされるのですが、これを「employee_id」で紐づきたいものです。

各テーブル

employees
イメージ説明
goods
イメージ説明

web.php

<?php Route::get('/', 'EmployeesController@index'); Auth::routes(); Route::get('index', 'HomeController@index')->name('index'); Route::group(['middleware' => 'auth'], function () { Route::resource('goods', 'GoodsController', ['only' => ['create', 'store', 'destroy']]); Route::resource('index', 'EmployeesController', ['only' => ['index']]); Route::resource('employee_create', 'EmployeesController', ['only' => ['index', 'create','store']]); });

Employee.php

<?php namespace App; use IlluminateSupportFacadesDB; use Illuminate\Database\Eloquent\Model; class Employee extends Model { protected $fillable = ['id','emlpoyee_id','employee_name','office']; public function goods() { return $this->hasMany(Goods::class); } }

Goods.php

<?php namespace App; use Illuminate\Database\Eloquent\Model; class Goods extends Model { protected $fillable = ['employee_id','uniform','winter_clothes','shoes','other','memo']; public function employee() { return $this->belongsTo(Employee::class); } }

EmployeesController

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Employee; use App\Goods; class EmployeesController extends Controller { public function index() { $employees = Employee::orderBy('id','desc')->get(); return view('index', ['employees' => $employees, ]); } public function create() { $user =\Auth::user(); return view('employee_create'); } public function store(Request $request) { $request->validate([ 'employee_id' => 'required|min:6|max:6', 'employee_name' => 'required', 'office' => 'required', ]); $employee = new Employee; $employee->employee_id = $request->input('employee_id'); $employee->employee_name = $request->input('employee_name'); $employee->office = $request->input('office'); $employee->save(); $goods = new Goods; $goods->uniform = $request->input('uniform'); $goods->winter_clothes = $request->input('winter_clothes'); $goods->shoes = $request->input('shoes'); $goods->other = $request->input('other'); $goods->memo = $request->input('memo'); $goods->employee_id = $employee->id; $goods->save(); return redirect(route('employee_create.index'))->with('flash_message','社員を登録しました'); } }

employee_create.blade.php

@extends('layouts.app') @extends('layouts.app') @section('content') <div class="container"> <div class="login-container"> <h3>新規社員登録</h3> <div class="card-body"> <form method="POST" action="{{ route('employee_create.store') }}"> @csrf <div class="form-group row"> <label class="col-md-4 col-form-label text-md-right">社員番号</label> <div class="col-md-6"> <input type="text" name="employee_id" class="form-control" value="{{old('employee_id')}}" placeholder="社員番号を入力してください"> </div> </div> <div class="form-group row"> <label class="col-md-4 col-form-label text-md-right">名前</label> <div class="col-md-6"> <input type="tel" name="employee_name" class="form-control" value="{{old('employee_name')}}" placeholder="名前を入力してください"> </div> </div> <div class="form-group row"> <label class="col-md-4 col-form-label text-md-right">所属事業所</label> <div class="col-md-6"> <select name="office" class="form-control"> <option value="">所属事業所を選択してください</option> <option value="1営業所">1営業所</option> <option value="2営業所">2営業所</option> <option value="3営業所">3営業所</option> <option value="4営業所">4営業所</option> <option value="5営業所">5営業所</option> </select> </div> </div> <div class="form-group row"> <label class="col-md-4 col-form-label text-md-right">制服</label> <div class="col-md-6"> <input type="text" name="unifrom" class="form-control" value="{{old('unifrom')}}" placeholder="制服を入力してください"> </div> </div> <div class="form-group row"> <label class="col-md-4 col-form-label text-md-right">防寒着</label> <div class="col-md-6"> <input type="text" name="winter_clothes" class="form-control" value="{{old('winter_clothes')}}" placeholder="防寒着を入力してください"> </div> </div> <div class="form-group row"> <label class="col-md-4 col-form-label text-md-right">靴</label> <div class="col-md-6"> <input type="text" name="shoes" class="form-control" value="{{old('shoes')}}" placeholder="靴を入力してください"> </div> </div> <div class="form-group row"> <label class="col-md-4 col-form-label text-md-right">その他</label> <div class="col-md-6"> <input type="text" name="other" class="form-control" value="{{old('other')}}" placeholder="その他を入力してください"> </div> </div> <div class="form-group row"> <label class="col-md-4 col-form-label text-md-right">メモ</label> <div class="col-md-6"> <input type="text" name="memo" class="form-control" value="{{old('memo')}}" placeholder="メモを入力してください"> </div> </div> <div class="form-group row mb-0"> <div class="col-md-8 offset-md-4"> <input type="submit" value="社員登録する" class="btn btn-primary"> <input type="reset" value="キャンセル" class="btn btn-secondary" onclick='window.history.back(-1);'> </div> </div> </form> </div> </div> </div> @endsection

以下、追加分です

create_employee_table.php

<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateEmployeesTable extends Migration { public function up() { Schema::create('employees', function (Blueprint $table) { $table->bigIncrements('id'); $table->integer('employee_id'); $table->string('employee_name'); $table->string('office'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('employees'); } }

create_goods_table.php

<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateGoodsTable extends Migration { public function up() { Schema::create('goods', function (Blueprint $table) { $table->bigIncrements('id'); $table->unsignedBigInteger('employee_id'); $table->string('uniform'); $table->string('winter_clothes'); $table->string('shoes'); $table->string('other'); $table->string('memo'); $table->timestamps(); $table->foreign('employee_id')->references('id')->on('employees')->onDelete('cascade'); }); } public function down() { Schema::dropIfExists('goods'); } }

マイグレーション実行時エラー画像

イメージ説明

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

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

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

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

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

Lulucom

2021/02/06 01:12

$goods->employee_id = $employee->id; となっているので紐づけて登録できている気がしますが、どのような問題が発生していますか?
ttt---aaa

2021/02/06 02:54

Lulucom さん コメントありがとうございます。再度確認したところ、employee_idが連動していることを確認しました。また別問題になるのですが、連動しているemployee_idが削除されると併せてgoodsも削除されるよう、「goodsテーブル」にて設定($table->foreign('employee_id')->references('id')->on('empoloyees')->onDelete('cascade');))しているのですがphpAdmin上で削除してもgoodが残っている状態です。こちらは連動していないということでしょうか?
Lulucom

2021/02/06 03:20 編集

連動していなさそうですね。 その外部キー制約の設定をgoodsテーブル作成のマイグレーションファイルに書かれたということだと思いますが、外部キー制約の設定を書かれた後にそのマイグレーションを実行し直しましたか?(マイグレーションファイルに書いただけではその設定は反映されないです。実行し直して初めて反映されます)
ttt---aaa

2021/02/06 03:34

テーブルはマイグレーションで作成しており、再度反映すべくphp artisan migrate:freshにて再作成しましたが、同様にemployee_idを削除してもgoodsは残ったままでした。
Lulucom

2021/02/06 04:11 編集

employeesテーブルからある社員のレコードを削除しても、goodsテーブルでその社員のレコードは残ったまま、ということでしょうか?
ttt---aaa

2021/02/06 04:51

その通りです。 また、マイグレーション実行時にエラーが発生しており、そこが原因でしょうか? マイグレーションファイルとエラー内容を追加しましたのでご確認いただけたらと思います。 調べると、idの型を合わせる旨の参考記事があるのですが上手くいかないため、何かアドバイスをお願いいたします????‍♂️
Lulucom

2021/02/06 04:55

はい、そこが原因です。 goodsテーブル作成のマイグレーション(CreateGoodsTable)で $table->integer('employee_id'); のところを $table->unsignedBigInteger('employee_id'); に修正するとどうでしょうか。 マイグレーション時のエラーは解消するのではないでしょうか。
ttt---aaa

2021/02/06 05:07

ご指摘いただいた通りgoodsテーブルの $table->unsignedBigInteger('employee_id');  を修正し実行(migrate:fresh)しましたが同様のエラーが残ったままとなります。 また、 employeesテーブルのemployee_idと繋げたいので、そちら型も「unsignedBigInteger」にしても変わらずでした…
Lulucom

2021/02/06 05:10

> employeesテーブルのemployee_idと繋げたい employeesテーブルのidと繋げるべきかと思います。
ttt---aaa

2021/02/06 05:32

ありがとうございます。繋ぐべきidについては理解いたしました。 マイグレーションファイルを修正し、再度発生したエラー内容を更新しましたので、大変お手数ですがご確認いただけたらと思います。(原因がわかりません…)
Lulucom

2021/02/06 05:38

migrate:refreshやmigrate:freshでもだめですか?
ttt---aaa

2021/02/06 05:45

freshにて再実行しても添付画像のエラーとなります。
Lulucom

2021/02/06 05:51 編集

質問の方にLaravelのバージョンも記載していただけますか?
ttt---aaa

2021/02/06 05:53

laravelのバージョナは6.20.8となります。お手数おかけします。
Lulucom

2021/02/06 06:22

質問に掲載されている下記3つですが、現在も同じ内容でしょうか。 ・create_employee_table.php ・create_goods_table.php ・マイグレーション実行時エラー 試しにこの内容で作成してマイグレーションしてみたのですが、正常に実行されるのですよね・・・
ttt---aaa

2021/02/06 06:36

掲載のままでして、エラーも同様のものとなります。 エラーもなく実行されますでしょうか? また、goodsテーブルのemployee_id にてunsignedの設定はemployeeテーブル側も修正が必要でしょうか?(現状、掲載の通りのままです)
ttt---aaa

2021/02/06 06:37

その他、外部キー制約の設定についてはモデルなどは関係なかったでしょうか? 単純にマイグレーション内の話でしょうか?
Lulucom

2021/02/06 06:47

エラーなく実行されます。 employeesテーブル側の修正は不要なはず。employees.idはbigIncrementsメソッドを使っているのでunsignedで作成され、employees.employee_idはgoods.employee_idとはとくに関係ありません。 モデルも関係ないはずです。
ttt---aaa

2021/02/06 06:50

解決しました! マイグレーションファイルの作成がgoodsが先に生成されていたことによるものでした。goodsマイグレーションを削除後作成し、マイグレーション実行したところエラーなく生成されました。 各所細かな説明など大変参考になり、理解が深まりました。この度は本当にありがとうございました!
Lulucom

2021/02/06 06:51

そういうことでしたかー、盲点でした。良かったです。
guest

回答1

0

ベストアンサー

goodsテーブルのemployee_idは
employeesテーブルのidに紐づけるべきかと思います。

create_goods_table.php

php

1 $table->unsignedBigInteger('employee_id'); 2 ... 3 4 $table->foreign('employee_id')->references('id')->on('employees')->onDelete('cascade');

投稿2021/02/06 05:34

Lulucom

総合スコア1899

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

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

ttt---aaa

2021/02/06 06:54

ご教示いただいた結果、 マイグレーションにて各テーブルを繋ぐ型が異なっていたことによるものでした。(詳細は質問欄参照)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問