SortBy или OrderBy по коллекции связей Laravel?

Добрый вечер. Стоит задача сортировки значений, при выборке из базы. В целом, если я реализую связь "один к одному", проблем нет, все работает. Но у меня в базе применяеться шаблон EAV. Каждый товар, пренадлежит к группе характеристик. У каждой характеристики есть поле position, по которому я выставить приоритет сортировки. После этого, у каждой характеристики есть связь с значением, привязанным к товару. И у этих значени, тоже есть поле position.

Допустим я получил данные из базы и делаю сортировку
$products->sortBy(function($q){
    return $q->relatedProduct->relatedSpecsGroup->position;
})

Это сработает если связь "relatedSpecsGroup" будет один к одному, но здесь реализуется связь "ко многим через", следовательно этот метод не сработает. В документации я ничего по этому поводу не нашел.

Выходит, что "relatedSpecsGroup" содержит в себе характеристики, привязанные к группе товара. А у каждой характеристики, есть значение, которое в свою очередь пренадлежит и товару и характеристике.

relatedSpecsGroup для каждого товара, выглядит вот так:
[
['id', 'title','position','relatedValue'=>['id','value','position']],
['id', 'title','position','relatedValue'=>['id','value','position']],
['id', 'title','position','relatedValue'=>['id','value','position']],
['id', 'title','position','relatedValue'=>['id','value','position']],
]

Мне нужно отсортировать по значения relatedValue, но прежде, отсортировать relatedSpecsGroup по position, тем самым выставляеться порядок сортировки для характеристик, а только потом для значений характеристик.

Как подобного рода сортировки делаються? Можно ли такую сортировку, сделать на уровне запроса, поскольку - это существенно быстрее, нежели метод sortBy на коллекции. Если нельзя, то как это реализуеться с помощью sortBy?

Спасибо!
  • Вопрос задан
  • 1772 просмотра
Пригласить эксперта
Ответы на вопрос 1
@jazzus
Попробуйте так
Product::with(['relatedSpecsGroup' => function($query) {
              $query->orderBy('position', 'desc');
             }])
       ->orderBy('relatedValue', 'desc')
       ->get();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы