簡體   English   中英

Laravel急切地加載和分組樞軸上的多個聯接

[英]Laravel Eager Load and Group Multiple Joins on Pivot

我有一個數據透視表,該數據透視表曾經用來連接其他兩個具有每個hotel_id關系的表。 有沒有一種方法可以讓我渴望加載一個關系,從而將兩個表的結果拉入一個關系中? 原始SQL查詢可以正常工作,但是在使用belongsToMany時,順序已關閉。

便利設施數據透視表

id
hotel_id 
distance_id
type_id

距離表

id
name

類型表

id
name

RAW查詢(工作正常)

SELECT * FROM amenities a 
LEFT JOIN distance d ON a.distance_id = d.id 
LEFT JOIN type t ON a.type_id = t.id WHERE a.hotel_id = ?

我的“酒店”模型正在像這樣使用belongsToMany

public function distance() {
    return $this->belongsToMany('Distance', 'amenities', 'hotel_id', 'distance_id');
}
public function type() {
    return $this->belongsToMany('Type', 'amenities', 'hotel_id', 'type_id');
}

這將輸出集合,但它們未正確分組。 我需要像在數據透視表中輸入的那樣,將它們並排循環到選擇字段中,以便用戶可以選擇“類型”和“距離”,但是在使用集合時順序不正確。 上面的原始查詢正確輸出。

Hotels::where('id','=','200')->with('distance', 'type')->take(5)->get();

確定解決了。 因此,顯然您可以在數據透視表上使用orderBy。 如果其他人有這個問題,這就是我在兩種關系中所做的。

public function distance() {
    return $this->belongsToMany('Distance', 'amenities', 'hotel_id', 'distance_id')->withPivot('id')->orderBy('pivot_id','desc');
}
public function type() {
    return $this->belongsToMany('Type', 'amenities', 'hotel_id', 'type_id')->withPivot('id')->orderBy('pivot_id','desc');
}

通過使用-> withPivot('id')-> orderBy('pivot_id','desc');解決

在問題中張貼答案。

在模型的關系方法中包括其他查詢構建步驟實際上不是一個好習慣。 關系方法應該只定義關系,別無其他。 一種更清潔的方法是應用急切的負載約束 (向下滾動)請考慮以下事項。

Hotels::where('id', 200)->with(array(
    'distance' => function ($query)
    {
        $query->withPivot('id')->orderBy('pivot_id','desc');
    },
    'type' => function ($query)
    {
        $query->withPivot('id')->orderBy('pivot_id','desc');
    },
))->take(5)->get();

如果發現您經常急於以這種方式加載此關系,請考慮使用范圍使事物保持干燥。 最終結果將使您可以執行以下操作。

Hotels::where('id', 200)->withOrderedDistance()->withOrderedType()->take(5)->get();

PS您的模型應該是單數。 酒店,不是酒店。 該模型代表一條記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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