LoginSignup
5
5

More than 5 years have passed since last update.

クエリビルダで生成したインスタンスに別テーブルの情報を付加してビューに渡す方法

Last updated at Posted at 2014-08-18

※コメント欄にてLaravelの機能を利用した方法をご教授頂きました。
 実装する際にはそちらを参照頂いた方がよいです。

やりたいこと

以下のようなDB設計のアプリケーションがあった場合に、あるページに会議情報の一覧とそれらに出席するユーザの人数を、それぞれの会議情報について付加して表示する。

ユーザテーブル:ユーザ情報を表現する
会議テーブル:会議の日程等の情報を表現する
ユーザ、会議テーブル:会議に出席するユーザを表現する
user
 -id
 -name
kaigi
 -id
 -date
kaigi_user
 -kaigi_id
 -user_id

例えば、以下のように会議室のデータをインスタンス化してビューに渡す方法が簡単です。しかし、ユーザの人数も合わせてビューに渡そうと思うと、kaigi_userのテーブルからそれぞれkaigiのkaigi_idが持つuser_idの数をcountしたデータをインスタンスに付加する必要があり、laravelに用意されているクエリビルダでは出来ないと思いました(私にはやり方がわかりませんでした)。

$kaigis = DB::table('kaigi')->get();

方法
方法としては簡単で、DB::tableの返り値は単なるオブジェクトのようです(userクラス単体のインスタンスであれば、Userというインスタンスになり、joinしたクラスで生成するとstdClassになるようです)。
PHPでは未定義のメンバ変数であっても、代入すれば自動的に定義されますので、それぞれのインスタンスにcount情報を付加すれば解決出来ます。

例えば、以下のような感じです。

foreach($kaigis as $value){
  $array = DB::table('kaigi_user')->wehre('kaigi_id', '=', $value->id) -> get();
  $value->sanka_user_count = count($array);
}

この例でいえば、生成したインスタンスにsanka_user_countというメンバ変数が付加されてビューに渡されますので、これをビューから参照すればよいです。

(他にもやり方がありそうです。もっとよいやり方があればご教授ください。)

5
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5