2015-06-02 5 views
0

У меня есть сводная таблица, которая использовалась для объединения двух других таблиц, которые имеют много отношений для hotel_id. Есть ли способ, которым я могу загрузить отношения, которые вытягивают результаты для обеих таблиц в одном отношении? Исходный SQL-запрос работает корректно, но при использовании ownToMany заказ выключен.Laravel Eager Load и Group Multiple Joins on Pivot

населённого Сводная таблица

id 
hotel_id 
distance_id 
type_id 

Расстояние Таблица

id 
name 

Тип Таблица

id 
name 

RAW Query (Это работает отлично)

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(); 

Ok Решено. Поэтому, видимо, вы можете использовать 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'); 
} 

ответ

0

Не очень хорошая практика включать другие шаги построения запросов в методы отношений на ваших моделях. Метод отношений должен просто определять отношения, ничего другого. Более чистый метод заключается в применении eager load constraints. (прокрутите вниз немного). Рассмотрим следующее.

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(); 

Если вы обнаружите, что вы с нетерпением загрузки этого отношения в этом случае часто, рекомендуется использовать scopes, чтобы держать вещи DRY. Конечный результат позволит вам сделать что-то вроде этого.

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

P.S. Ваши модели должны быть единственными. Отель, а не отели. Модель представляет собой одну запись.

+0

Интересно, не знал, что вы можете это сделать. Спасибо за это, это полезно. Я думаю, что буду использовать область действия, поскольку она будет использоваться довольно часто. – limit

0

решаемые с помощью -> withPivot ('ID') -> OrderBy ('pivot_id', 'по убыванию');

Опубликованный ответ в вопросе.