[英]multiple “has many through” with eloquent of laravel
我雄辯地說,laravel的ORM出了問題,但沒有找到解決方案。
我有一些表格如下
球隊
- id
- name
用戶
- id
- name
- role
- team_id
學生信息
- id
- user_id
- data1
- data2
- etc ...
項目
- id
- student_id
- name
現在,我要查詢某個team
所有項目,其中team = 'some team'
現在,這里的事情是,沒有ORM,這很簡單,我將在原始SQL中進行多個聯接。
但是,由於所有這些表都有一個公共列“名稱”,因此我必須為所有這些東西加上別名,這確實很無聊
雄辯地說,我找不到使用“有很多通過”的方式進行此查詢的方法,因為它只允許使用中級語言,而我無法執行原始SQL,因為alis的事情確實很麻煩,因為它將結果映射到laravel的模型非常困難
嘗試建立關系。 假設您已經正確定義了所有關系
$projects = Project::whereHas('students.user.team', function ($query) {
$query->where('name', '=', 'some team');
})->get();
這是3個層次的嵌套。 從未測試。 但是,如果您已經通過hasManyThrough()
定義了項目-用戶關系, hasManyThrough()
只能將其縮短到2級。
$projects = Project::whereHas('user.team', function ($query) {
$query->where('name', '=', 'some team');
})->get();
這些將僅為您提供項目數據。 如果您還需要中間數據,請使用即時加載代替with()
。 只需用whereHas()
替換whereHas()
with()
。
$projects = Project::with('user.team', function ($query) {
$query->where('name', '=', 'some team');
})->get();
在這種情況下沒有本機關系。
我創建了一個具有無限級別的HasManyThrough
關系: GitHub上的存儲庫
安裝后,您可以像這樣使用它:
class Team extends Model {
use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
public function projects() {
return $this->hasManyDeep(Project::class, [User::class, StudentInfo::class],
[null, null, 'student_id']);
}
}
$projects = Team::where('name', 'some team')->first()->projects;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.