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

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

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

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

Laravel

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

PHP

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

Laravel 5

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

Q&A

解決済

1回答

6055閲覧

Laravel5での中間テーブルを使ったリレーションについて

S_O

総合スコア16

MySQL

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

Laravel

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

PHP

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

Laravel 5

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

1グッド

1クリップ

投稿2016/10/09 15:47

###前提・実現したいこと
現在、「ユーザーがお気に入りの画像を登録」→「自分のマイページでお気に入り記事一覧を表示」
するという実装をしたいのですが、以下のようなエラーが発生しております。中間テーブルを使ったデータの取得方法をご教授いただきたいです。

ErrorException in UserController.php line 22: Undefined property: Illuminate\Database\Eloquent\Collection::$images

■テーブル設計

【userテーブル】
id | name | password | created_at | updated_at |

【Imageテーブル】
id | image | user_id | created_at | updated_at |

【favoriteテーブル】
user_id | image_id | created_at | updated_at |

■UserController
userのidをもとにfavoriteテーブルを介し、imageテーブルのデータを取得しようと、以下のコードを書いています。

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Image; use App\User; use App\Auth; class UserController extends Controller { public function index(){ $user = \Auth::user(); $viewDate["favoriteImages"] = $user->favorites->images; return view("Frontend.user.index", $viewDate); } }

■index.blade.php(Frontend.user.index)ファイル
お気に入り記事を表示するマイページ

@foreach($favoriteImages as $image) <li> <img src="{{ $image->image }}"> <form action="/favorite/add/{{ $image->id }}" method="post"> <input type="hidden" value="{{ $image->id }}"> {{ csrf_field() }} <button type="submit">お気に入り</button> </form> </li> @endforeach

■User.php
Userモデル

public function favorites(){ return $this->hasMany('App\Favorite'); } public function images(){ return $this->hasMany('App\Image'); }

■Image.php
Imageモデル

public function favorites(){ return $this->hasMany('App\Favorite'); // return $this->belongsToMany('App\Favorite', "favorites"); } public function users(){ return $this->belongsTo('App\User'); }

■Favorite.php
Favoriteモデル

public function user(){ return $this->belongsTo('App\User'); } public function images(){ return $this->belongsTo('App\Image', "favorites"); }

###試したこと
①UserControllerにてdd($hoge->toArray());を使うと

class UserController extends Controller { public function index(){ $user = \Auth::user(); if (\Auth::check()){ $user = \Auth::user(); }else{ // throw new ErrorException("お気に入り機能を利用するには会員登録が必要です"); } $viewDate["postImages"] = $user->images; $viewDate["favoriteImages"] = $user->favorites; dd($viewDate["favoriteImages"]->toArray()); // $viewDate["favoriteImages"] = $user->favorites()->images(); return view("Frontend.user.index", $viewDate); } }

②以下のようなFavoriteのデータの取得はできたのですが、これらのuserのidに付随したimageのデータを取得したいと思っております。

array:6 [▼ 0 => array:4 [▼ "user_id" => 2 "image_id" => 2 "created_at" => "2016-10-09 07:38:55" "updated_at" => "2016-10-09 07:38:55" ] 1 => array:4 [▼ "user_id" => 2 "image_id" => 1 "created_at" => "2016-10-09 07:39:06" "updated_at" => "2016-10-09 07:39:06" ] 2 => array:4 [▶] 3 => array:4 [▶] 4 => array:4 [▶] 5 => array:4 [▶] ]
wokapi👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

今回のケースですと、リレーションの定義にbelongsToManyを使うと楽になります。

具体的には、中間テーブルとなっているFavoriteモデルには何も書かず、
その両端にあたるモデル(今回はUserだけでOK)に以下のような記述をします。

PHP

1// Userモデル 2public function favoriteImages() 3{ 4 return $this->belongsToMany('App\Image', 'favorites'); 5} 6 7// Favoriteモデル 8// リレーションに関する設定は不要なので削除してOK

で、$user->favoriteImages とすることで、中間テーブルを通して結びついているImageのリスト(と中間テーブル情報のpivot)が取得できます。

PHP

1class UserController extends Controller 2{ 3 public function index(){ 4 $user = \Auth::user(); 5 // 省略 6 7 $viewDate["favoriteImages"] = $user->favoriteImages; 8 dd($viewDate["favoriteImages"]->toArray()); 9 } 10}

投稿2016/10/09 17:49

Archsted

総合スコア452

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

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

S_O

2016/10/10 09:24

試したところ実装することができました!あるがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問