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

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

ただいまの
回答率

87.79%

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

受付中

回答 2

投稿 編集

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

score 13

前提・実現したいこと

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文を用いて、表示させようともしたのですが、
全て同じ部署名になってしまっています。
(画像はエラー箇所をコメントアウトして表示した内容です。)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/03 01:09

    確認していただきありがとうございます。真ん中のdepertはテーブル名だったんですね。完全に勘違いしておりました。また再度、indexを$item->depart->nameに修正してみたのですが、

    Trying to get property 'name' of non-object

    と、nameが問題になっているようで、ここをdept_nameにしても同じでした。

    キャンセル

  • 2019/01/03 01:12

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

    キャンセル

  • 2019/01/03 01:15

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/01/03 15:20

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

    キャンセル

  • 2019/01/03 15:28

    とりあえず現状で動作させるには、

    <? $depart = Depart::where('dept_id', $item->dept_id)->first(); ?>
    {{ $depart->dept_name }}

    とすればうまくいくかもしれません。
    あまりよくないコードですが。

    キャンセル

  • 2019/01/04 09:48

    <? $depart = Depart::where('dept_id', $item->dept_id)->first(); ?>
    {{ $depart->dept_name }}

    では、Undefined variable: depart と現状出てしまいました。

    departテーブル内にdept_idを設けたのは、peopleテーブルのdept_idと同じカラム名である必要があると勘違いしておりました。いただいた情報を元にテーブルを作りなおそうと思います。

    キャンセル

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

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

関連した質問

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