2017-04-05 11 views
0

laravelのORMに問題があり、雄弁になりましたがまだ解決策が見つかりませんでした。複数のlaravelの雄弁を持つ複数の "through through"

チーム

- id 
- name 

ユーザー

- id 
- name 
- role 
- team_id 

Student_Info

を次のように私はいくつかのテーブルを持っています
- id 
- user_id 
- data1 
- data2 
- etc ... 

- id 
- student_id 
- name 

は今、私はteam = 'some team'

が今ここの事は、ORMせずに、それは簡単です、私が行っていたすべてのプロジェクト特定のteamを、照会したいプロジェクト生のSQLでの複数の結合すべてのこれらのテーブルは共通の列を持っているので、

しかし、「名前」私は私が使用してこのクエリを実行する方法を見つけることができません、本当に雄弁で

を退屈され、すべてこのようなものを、エイリアスする必要があります「あり多くのスルー」と言われています。なぜなら、中間言語を使用することができ、生のSQLを行うことはできません。なぜなら、エイリアスのことは本当に痛みであり、結果をlaravelのモデルにマップすることは非常に難しいからです。

+0

プロジェクトテーブルでもteam_idを使用します。 –

+0

それは事実上、プロジェクトはプロジェクトに直接所属するのではなく、学生に重複して作成され、モデルの実際のものに混乱を招くので、それはデータベース設計の非常に悪い習慣です。 – darkylmnx

答えて

0

存在。これは、すべての関係が適切に定義されていることを前提としています。

$projects = Project::whereHas('students.user.team', function ($query) { 
    $query->where('name', '=', 'some team'); 
})->get(); 

これは3レベルのネストです。決してテストされません。ただし、すでにhasManyThrough()でプロジェクトとユーザーの関係を定義している場合は、2レベルに短縮することができます。

$projects = Project::whereHas('user.team', function ($query) { 
    $query->where('name', '=', 'some team'); 
})->get(); 

これらは、プロジェクトのデータのみを提供します。中間データも必要な場合は、with()の代わりに熱心な読み込みを使用してください。 whereHas()with()で置き換えてください。

$projects = Project::with('user.team', function ($query) { 
    $query->where('name', '=', 'some team'); 
})->get(); 
+0

私はこれを前に試してみましたが、単純なクエリでは機能しましたが、フィルターやstuffを使った複雑なものでは機能しませんでした(そしてlaravelによって作成されたクエリはきれいでした...パフォーマンス+使いやすさ) – darkylmnx

+0

興味深い。逆にすることはできますか?元の質問を使用すると、project_idでプロジェクトチームを獲得し、ロードされたプロジェクトが得られる可能性がありますか? –

関連する問題