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