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

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

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

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

Laravel 5

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

Q&A

2回答

1588閲覧

Laravel5.5 1対多 リレーション でうまく動作しない

0isekai

総合スコア13

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2019/01/02 10:53

編集2019/01/02 17:05

前提・実現したいこと

Laravel5.5にて社員管理システムを作っております。
画像の社員一覧ページにて、今はすべての社員が同じ部署になっていますが、
各社員ごとに異なる部署名を表示させたいと考えております。

1対多 モデル
・Person.php(dept_name以外の要素全て)
・Depart.php(dept_idとdept_nameのみの要素)

ブラウザ表示画面
peopleテーブル
departテーブル

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

Property [dept_id] does not exist on this collection instance.

PersonController.php(該当箇所のみ)

class PersonController extends Controller { public function index(Request $request) { // //peopleテーブルの全レコードを取得する $items = Person::all(); //peopleテーブルの全dept_id $person = Person::select('dept_id')->get(); //「固有ID」personテーブルから出した部署IDに当てはまる部署をBoardテーブルから取得 $dep_relate = \App\Depart::find($person->dept_id); //「全ID」ボードテーブルから部署名全てを取得 // $dep_all = \App\Depart::all(); //部署名以外の情報、共通するIDの部署、全部署名を更新ページへ返す return view( 'person.index', [ 'items' => $items, 'form_person' => $person, //部署以外のデータ // 'form_all' => $dep_all, //全部署名 'form_relate' => $dep_relate //リレーションの部署名 ] ); }

index.blade.php(該当箇所のみ)

@foreach ($items as $item) <tr> <td>{{$item->name}}</td> <td>{{$item->number}}</td> {{-- <td>{{$item->dept_id}}</td> --}} {{-- 部署 --}} @if("{{$item->dept_id}}" === "1") <td>営業部</td> @elseif("{{$item->dept_id}}" === 2) <td>コーポレート部</td> @elseif("{{$item->dept_id}}" === 3) <td>開発部</td> @else <td>メディア部</td> @endif {{$form_relate->dept_name}} {{-- 性別 --}} @if("{{$item->gender}}" == 0) <td>men</td> @else <td>women</td> @endif {{-- <td>{{$form_relate->dept_name}}</td> --}} <td><a href="http://homestead.test/show?id={{$item->id}}">詳細</a></td> <td><a href="http://homestead.test/edit?id={{$item->id}}">更新</a></td> <td><a href="http://homestead.test/del?id={{$item->id}}">削除</a></td> </tr> @endforeach

Depart.php(該当箇所のみ)

<?php namespace App; use Illuminate\Database\Eloquent\Model; class Depart extends Model { public function person(){ return $this->hasMany('App\Person'); } }

Person.php(該当箇所のみ)

class Person extends Model { //guardedは入力の保護を設定するもの protected $guarded = array('id'); public function depart() { return $this->belongsTo('App\Depart'); } //timestampの無効化 public $timestamps = false; }

###create_dept_table.php

class CreateDeptTable extends Migration { public function up() { Schema::create('departs', function (Blueprint $table) { $table->increments('dept_id'); $table->string('dept_name'); }); } public function down() { Schema::dropIfExists('departs'); } }

試したこと

現在はコメントアウトしてしまっていますが、indexの

<td>{{$form_relate->dept_name}}</td> にて、社員それぞれの部署名を表示させたいです。

また今の状態で、indexにて代わりに部署名をif文を用いて、表示させようともしたのですが、
全て同じ部署名になってしまっています。
(画像はエラー箇所をコメントアウトして表示した内容です。)

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

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

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

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

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

guest

回答2

0

そこまではokですね。
リレーションがちゃんとできていればitem->departで部署インスタンスが取得できるはずなんですがここがうまくいってない気がします。

投稿2019/01/02 16:19

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/01/02 16:21

間違えて回答欄に書いてしまった… ひとまずdepartテーブルのカラムをすべて書き出してもらって良いですか?
0isekai

2019/01/02 16:59

気がつくのに遅れてしまいました。テーブル内容アップしました。マイグレート後にdepartテーブルにidを追加したのですが、それが問題だったのでしょうか?
退会済みユーザー

退会済みユーザー

2019/01/03 06:20

そうですね、カラムの命名がおかしいのでLaravelに認識されていないと思います。オートインクリメントの主キーは必ずidという命名にして下さい。 departテーブルの中でdept_と付ける必要はないし、付けない方が良いです。 departテーブルの中のカラムなのでそれがdepartの要素であることは明らかだからです。 personテーブルの中でdept_idとしているのは外部の要素だからdept_という接頭辞を付けているわけです。
退会済みユーザー

退会済みユーザー

2019/01/03 06:28

とりあえず現状で動作させるには、 <? $depart = Depart::where('dept_id', $item->dept_id)->first(); ?> {{ $depart->dept_name }} とすればうまくいくかもしれません。 あまりよくないコードですが。
0isekai

2019/01/04 00:48

<? $depart = Depart::where('dept_id', $item->dept_id)->first(); ?> {{ $depart->dept_name }} では、Undefined variable: depart と現状出てしまいました。 departテーブル内にdept_idを設けたのは、peopleテーブルのdept_idと同じカラム名である必要があると勘違いしておりました。いただいた情報を元にテーブルを作りなおそうと思います。
guest

0

モデル貼られてないので確証はないですが適切にテーブル設計とリレーション設定されていれば $item->depart->name のような記述でpersonから部署名は取れるかと。

投稿2019/01/02 15:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0isekai

2019/01/02 15:58

ご回答ありがとうございます。モデル内容を追記させていただきました。indexに<td>{{$item->dept_id->dept_name}}</td>と追記してみたのですが、ダメでした。
退会済みユーザー

退会済みユーザー

2019/01/02 16:00

モデル見ました。想定通りですね。 よく見て下さい。 $item->depart->name です。
0isekai

2019/01/02 16:09

確認していただきありがとうございます。真ん中のdepertはテーブル名だったんですね。完全に勘違いしておりました。また再度、indexを$item->depart->nameに修正してみたのですが、 Trying to get property 'name' of non-object と、nameが問題になっているようで、ここをdept_nameにしても同じでした。
退会済みユーザー

退会済みユーザー

2019/01/02 16:12

たぶんそのエラーはdepartの時点で取れてないですね。 item->dept_idは取れてるんでしょうか?
0isekai

2019/01/02 16:15

そうなのですね。item->dept_idを追記してみまして、dept_idはブラウザ表示できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問