簡體   English   中英

多方的“有很多通過”與雄辯的laravel

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM