2017-11-09 7 views
0

私はlaravel greenhornです。まあ、おそらく私はそのプロジェクトで長らく主演しています。 私は次のような状況に陥っています:Laravel他のテーブルから多対多のデー​​タを取得しています

私は企業のための "日記"を構築しています。私のデータベースのテーブルは以下の通りです。

私の目標は、同じ企業内のユーザーだけが、その企業に関連するレポートを見ることができるということです。だから私のreportControllerで私のインデックスメソッドに次の行があります:

$enterpriseId = Auth::user()->enterprise_id; 
$enterpriseProjects = Enterprise::find($enterpriseId)->projects()->get(); 
$enterprises = Enterprise::find($enterpriseId); 
foreach ($enterprises->projects as $key => $pivotTableProject) { 
     $reports = Report::where('project_id', $pivotTableProject->pivot->project_id)->get(); 
} 

return view('reports.index')->with('reports', $reports); 

期待どおり、私のデータベースから1つだけのエントリを取得します。同じエンタープライズのすべてを取得するにはどうすればよいですか?レポートを配列に入れた場合、私はこれを(ddで)得る:

array:2 [▼ 
    0 => Collection {#250 ▼ 
    #items: array:1 [▶] 
    } 
    1 => Collection {#239 ▼ 
    #items: array:1 [▶] 
    } 
] 

しかし、私はそこに1つの配列とレポートを持つコレクションが必要です。 誰かが絶望的なラベール初心者を助けることができますか?

ありがとうございます。 Image of database part here

答えて

0

は最後に、私はこれらの行で、昨日の問題を解決しました)。あなたの助けを感謝@ HasilT。あなたは私を正しい方向に押し込んだ。

0

これを達成する方法はたくさんありますが、ここでは1つの解決策です。 これはコードスニペットです(完全な解決策ではありません。構築中のシステムをセットアップする際に問題があります)。

私がそれを実装した方法は、制約付きネストされたeager loadingの関係を使用しています。このソリューションが機能するために

$reports = Report::with([ 
     'project' => function ($project) use ($enterpriseId) { 
      return $project->with([ 
       'enterprise_project' => function ($enterprise_project) use ($enterpriseId) { 
        return $enterprise_project->with([ 
         'enterprise'=>function($enterprise) use($enterpriseId){ 
          return $enterprise->where('id', $enterpriseId); 
         } 
        ]); 
       } 
       ]); 
      } 
      ])->get(); 

私はあなたがProjectモデルを接続しているあなたのReportモデルで

  • project方法を持っていると仮定します。
  • enterprise_project方法Project dbテーブルenterprise_projectを接続するモデルです。
  • enterprise方法enterpriseテーブル/モデルに接続するenterprise_projectモデルでは、

laravelドキュメント(link

PSに熱心なロードセクションを制約読みくださいコードまたは任意の混乱の上に従うことが困難である場合は、次のコードに何か問題がある場合は、コメント気軽に/編集答え。 $usersEnterpriseId = Auth::user()->enterprise_id; $enterprises = Enterprise::find($usersEnterpriseId); foreach ($enterprises->projects as $pivotTableProject) { $reports[] = Report::where('project_id', $pivotTableProject->pivot->project_id)->get(); }

私ReportControllerでそして私の見解で、私は結果を示しています2のforeachループを経由して(もちろんない最善の解決策が、それは私の作品:

+0

お返事ありがとうございます。私は今日それを試し、熱心な読み込みについて読む。私は '$ enterpriseProjects = Enterprise :: find($ enterpriseId) - > projects() - > get();'と一緒に行くことができると思っていました。私は報告書にそれを「接続する」必要があります。 –

+0

私はそれがうまくいくと思う:) – HasilT

関連する問題