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

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

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

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

Q&A

解決済

1回答

3153閲覧

Laravel5.4 一つのカラムに複数ID登録できない

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel 5

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

0グッド

0クリップ

投稿2017/08/21 03:23

Admin管理システムからUserテーブル(Userアカウントを作っています)のNameを選択し、JoBテーブルのjob_idに複数id番号を登録したいのですがやり方がわりません、

教えてくださいませ!!

詳細:
Admin管理システムにてUserアカウントを作成する

Adminテーブル:
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');

Userテーブル:
$table->increments('id');
$table->string('name');
$table->string('company_name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();

Jobテーブル:
$table->increments('id');
$table->integer('user_id')->unsigned()->index();
$table->integer('job_id')->unsigned()->index();
$table->timestamps();

やりたいこと:Admin管理ステムにて、Userテーブル毎にJob_idを登録したい,また、登録したIDごとに検索できるようにしたいです。
イメージ的に下記画像参照:
イメージ説明

現在出ているエラー:

SQLSTATE[01000]: Warning: 1265 Data truncated for column 'job_id' at row 1 (SQL: insert into `jobs` (`job_id`, `user_id`, `updated_at`, `created_at`) values (123488 ,999000,887766, 2233665,, 1, 2017-08-21 12:06:04, 2017-08-21 12:06:04))

JobControllerは下記:

public function create() { $users = User::pluck('name','user_id'); return view('jobs.index',compact('users')); } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $user= Auth::user(); Job::create([ 'name' => request('name'), 'job_id' => request('job_id'), 'user_id' => request('user_id') ]); return redirect('/admin/jobs/index'); }

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

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

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

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

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

guest

回答1

0

ベストアンサー

データベース定義でJobテーブルのjob_id列はinteger型で登録されているので、「123488 ,999000,887766, 2233665」という文字列データを保存しようとして失敗しています。
ひとまずrequest('job_id')はカンマ区切りでPOSTされてくるデータとしてexplodeで配列に直してあげて繰り返し処理をしながらjobを一つ一つ登録すると保存できるかと思います。

#request('job_id')は "123488,999000,887766,2233665"として $user=Auth::user(); collect(explode(",",request('job_id')))->each(function($job_id) use($user){ $job = new Job([ 'name' => request('name'), 'job_id' => trim($job_id), ]); $job->user()->associate($user); #jobの親データとしてuserデータを指定 $job->save(); });

tapメソッドを使ってまとめて書くこともできます

$job = tap(new Job([ 'name' => request('name'), 'job_id' => trim($job_id), ]),function(Job $instance) use(User $user) { $instance->user()->associate($user)->save() });

投稿2017/08/21 03:52

編集2017/08/21 04:11
aro10

総合スコア4106

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

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

退会済みユーザー

退会済みユーザー

2017/08/21 04:49

@aro10 ありがとうございます。 ご指摘通りでexplodeを使って見ましたら下記のエラーが出てしまいました。 SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'user_id' cannot be null (SQL: insert into `jobs` (`job_id`, `user_id`, `updated_at`, `created_at`) values (123456, , 2017-08-21 13:48:23, 2017-08-21 13:48:23))
aro10

2017/08/21 05:05

$job->user()->associate($user)でuserと外部キーでの関連は設定されているかと思いますがModelのリレーション設定を再確認してみてください ひとまず$job->user_id = $user->id; で直接代入してsaveしてみてください
退会済みユーザー

退会済みユーザー

2017/08/21 05:22

jobテーブルのModelリレーションは下記です。 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Job extends Model { protected $fillable = [ 'user_id', 'job_id' ]; public function user(){ return $this->belongsTo('App\User'); } }
aro10

2017/08/21 05:32

Model定義は見た感じだと設定はうまく言っている気がしますが、直接代入でsaveできればその方法でも問題ないので確認してみてください。
退会済みユーザー

退会済みユーザー

2017/08/21 06:16

@aro10 原因はわからなかったため、 job_idをstringに変更し、下記のように直しました、問題なく複数IDは登録されていますが何かよくない点とかありますか? Job::create([ 'name' => request('name'), 'job_id' => request('job_id'), 'user_id' => request('user_id') ]);
aro10

2017/08/21 07:14

job_idに複数データが入ると非正規化になってしまいusersテーブルとのリレーションが外部キーやbelongsToできなくなりますが、プログラムで都度結びつけ処理をするのであれば一応動作は可能なので、難しいと感じたらはじめのうちはこのやり方でも良いかもしれません。 ただ余分な処理としてバクの元になりやすいので内容理解が進んだ際はリレーションを適切に結ぶことに挑戦してみてください
退会済みユーザー

退会済みユーザー

2017/08/21 08:51

@aro10 ありがとうございます。 @aro10さんのexplode方法でやれば問題ないと思いますがColumn 'user_id' cannot be null になっている理由がわかりません。
aro10

2017/08/21 08:56

エラーとしては、jobsテーブルのデータ保存時に、NotNull制約のuser_idにデータが無いから保存できないという事ですが、Jobモデルクラスのfillableにもuser_idは設定しているのでどこか細かい誤字とか変なキャッシュがあるのかもしれません・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問