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

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

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

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

Q&A

解決済

1回答

2342閲覧

laravelでviewへの値の渡し方について

hiromitsu3

総合スコア11

Laravel 5

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

0グッド

0クリップ

投稿2018/06/16 05:39

laravelを学習中です。アドバイス頂けたらと思います。

employees
id
dept_id
name

deptsテーブル
id
dept_name

・従業員は、一つの部署に所属する。
・部署は、複数の従業員をもつ。

Employeeモデルクラスに

public function dept() { return $this->belongsTo(Dept::class); }

を追加する。

web.phpでの検証

php

1Route::get('/belongsto',function(){ 2 $employees = App\Employee::all(); 3 foreach($employees as $employee) 4 { 5 echo $employee->dept->dept_name." ".$employee->name."<br>"; 6 } 7 return; 8});

この場合、部署と名前の一覧が取得・表示できました。

その後、コントローラー(EmployeeController)とビューファイルを作成し、

php

1 function index() 2 { 3 $employees = Employee::all(); 4 return view('employee.belongsto',compact('employees')); 5 }

として、
belongsto.blade.phpにて

@foreach($employees as $employee) <p>{{ $employee->dept->dept_name }}</p> <p>{{ $employee->name }}</p> @endforeach

とすると、
Trying to get property 'dept_name' of non-object
とエラーが出てしまいます。

route/web.phpと同じように
$employ->dept->dept_name
とアクセスするのは間違っているのでしょうか?

関連テーブルの値をビューに渡すのはどのようにするのがいいのでしょうか?

宜しくおねがいします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

すみません、最初の回答誤っていたので忘れて下さい。

まず、

function index() { $employees = Employee::all(); return view('employee.belongsto',compact('employees')); }

こちらのControllerの段階で$employeesに本当に値が入っているか確認してみて下さい。
値が入っていたら、

@foreach($employees as $employee) <p>{{ $employee->dept->dept_name }}</p> <p>{{ $employee->name }}</p> @endforeach

こちらのViewで$employeesに値が入っているか確認してみて下さい。

追記

Laravelのlogger機能を使ってデバッグしてみて下さい。
まず、storage/logs/laravel.logを削除して下さい(すでに大量のログがあるはずで、これからのデバッグ結果が見づらいため)。
続いて、controllerを次のような感じに書いてみて下さい。

function index() { $employees = Employee::all(); logger($employees); logger($employees->first()); logger($employees->first()->dept); return view('employee.belongsto',compact('employees')); }

書き換えたら、ブラウザで問題のページにアクセスし、プログラムを動かして下さい。
そうすると、storage/logs/下にlaravel.logが生成されているはずですので、中身を確認して下さい。
必要なデータが有り、ちゃんとリレーションが設定できていれば、$employees->first()->deptの結果がログに出力されているはずです。
私が示したソースのパターン以外にも、色んな値のとり方を試みれば、うまくいかない原因に近づけるかと思います。

追記2

https://github.com/dyoshikawa/teratail-131441

サンプルコード書いてみたのでご参考になればと思います。
動かす場合は、

php artisan migrate php artisan db:seed

を実行した後、サーバー起動してトップページを見て下さい。

投稿2018/06/16 13:55

編集2018/06/17 06:49
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hiromitsu3

2018/06/16 14:04

回答有り難うございます。 試してみましたが、Undefined variableとエラーが出ます。 見直してみます!
退会済みユーザー

退会済みユーザー

2018/06/16 14:22

すみません、私の回答がおかしかったので修正致しました。
hiromitsu3

2018/06/16 14:35

ありがとうございます。 Controllerで$employeesを確認すると、中身が入っておりました。 またViewのほうで、$employeesを確認すると同じく値が入っておりました。 $employeesの一つのemployeeは、deptテーブルのidを保持しているのですが、 deptテーブルのdeptnameが参照できないようです。 ($employee->dept->dept_nameがおかしい) 見直してみます。
退会済みユーザー

退会済みユーザー

2018/06/16 14:44 編集

ありがとうございます。$emploee->deptは確かにとれているでしょうか?dept_idはとれていてもdeptを引っ張ってこれていないことが原因のように思います。
hiromitsu3

2018/06/16 14:46

Viewにおいて echo $employees->count(); foreach($employees as $employee) { echo $employee->dept; } このようにしてみました。 countは登録されたデータの数が返ってきているようなのですが、 foreachが動いてないのですが、何が悪いのでしょうか? 宜しくおねがいします。
hiromitsu3

2018/06/16 14:58 編集

すいません。 $employee->deptは取得できていませんでした。 そうなるとModelのほうの記述がおかしいという理解でいいのでしょうか?
退会済みユーザー

退会済みユーザー

2018/06/16 15:31

うーん、web.phpではできていたようですし、原因が思いつかないですね・・・ちょっとデバッグ方法を追記したので、試してみて下さい。
hiromitsu3

2018/06/16 15:46

度々すいません。 logger($employees);が {"id":1,"dept_id":1,"name":"\u7530\u4e2d"},{"id":2,"dept_id":2,"name":"\u7389\u6728"} logger($employees->first());が [2018-06-16 15:43:49] local.DEBUG: {"id":1,"dept_id":1,"name":"\u7530\u4e2d"} となりますが、 logger($employees->first()->dept); は何も表示されません。 ローカルですので一度ゼロからやり直してみようと思います。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/06/16 15:54 編集

解決に繋がるかは分かりませんが、一応、EmployeeとDeptのModelソースを貼って頂ければ拝見します。
hiromitsu3

2018/06/16 16:34

すいません。 Employee.php <?php namespace App; use Illuminate\Database\Eloquent\Model; class Employee extends Model { public $timestamps = false; protected $fillable = ['dept_id','name']; public function dept() { return $this->belongsTo('App\Dept'); } } Dept.php <?php namespace App; use Illuminate\Database\Eloquent\Model; class Dept extends Model { public $timestamps = false; protected $fillable = ['dept_name']; protected $primaryKey = "dept_id"; public function employees() { return $this->hasMany('App\Employee'); } } となります。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/06/16 17:01

deptモデルの主キー設定がちょっと違う気がしますね。マイグレーションファイルも見てよろしいですか?
hiromitsu3

2018/06/16 17:51

ありがとうございます。 migrationしたあと、phpmyadminで変更した気がしますので +-----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------+------+-----+---------+----------------+ | dept_name | varchar(32) | NO | | NULL | | | dept_id | int(10) unsigned | NO | PRI | NULL | auto_increment | +-----------+------------------+------+-----+---------+----------------+ +---------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | dept_id | int(11) | NO | | NULL | | | name | varchar(32) | NO | | NULL | | +---------+------------------+------+-----+---------+----------------+ これで大丈夫でしょうか?
退会済みユーザー

退会済みユーザー

2018/06/17 06:44

恐らく、deptの主キーをdept_idにしているのがおかしいですね。 追記しますのでご確認下さい。
退会済みユーザー

退会済みユーザー

2018/06/17 06:52

私もそれは考えたのですが、手元で動かしたら大丈夫だったんですよね。eagerはあくまでパフォーマンスの観点で必要という理解です。
trewa-nek9585

2018/06/17 07:06 編集

そうなんですね。勉強になります。横から失礼いたしました。
退会済みユーザー

退会済みユーザー

2018/06/17 07:08

いえ、補足ありがとうございます。
hiromitsu3

2018/06/17 10:24

ありがとうございました。 頂いたソースで試した所ちゃんと動きました。 対象フィールドのデータ型の違いと、migrationファイルの $table->foreign('dept_id')->references('id')->on('depts'); が相違してると思いました。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/06/17 10:46

Laravelは楽しいフレームワークですので、引き続きがんばって下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問