OrderBy или SortBy по нескольким условиям? - PullRequest
0 голосов
/ 03 июня 2019

Я использую шаблон EAV в моей БД.Это означает, что у меня есть продукт, который принадлежит множеству спецификаций, а спецификации относятся ко многим значениям спецификаций.

Мне нужно отсортировать товар по условию.Например, у моей продукции есть группа спецификаций.Такой продукт, как iPhone 6, имеет группу «телефон», а группа «телефон» имеет такие характеристики, как дисплей, память, память.Все эти спецификации имеют столбец положения, такой как RAM (POS 1), Storage (POS 2), Display (Pos 3).Внутри каждой спецификации множество значений и каждое значение также имеют столбец положения.

Поэтому, когда я выбираю все свои продукты, каждый продукт имеет отношения с группой.Я использую красноречивые отношения hasManyThrough, чтобы получить все спецификации, которые связаны с группой.

Вот так выглядит моя коллекция: https://pastebin.com/8TAM62wt

В соответствии с примером мне нужно отсортировать свою позицию по значению спецификации, но значения должны быть получены по таблице спецификаций столбца позиции.Мой английский не очень хороший, поэтому я приведу еще один пример.

Здесь, в этом коде https://pastebin.com/QnC7Drq3

Мне нужно отсортировать все продукты по значениям спецификации, где таблица спецификаций имеет заголовок Display, потому чтоего позиция равна 1. Поэтому я отсортировал свой продукт по дисплею, а затем перешел к следующей спецификации с более высоким значением позиции.В соответствии с этим примером это будет Storage, причина позиции равна 3.

Я знаю единственный способ, как сортировать, и это работает, когда relatedSpecifications является массивом (коллекцией), но не работает, когда это массивan of array.

$products = ModelProvidersProducts::has('relatedProduct')->where('quantity', '!=', 0)->get();
$products->sortBy(function($q){
    return $q->relatedProduct->relatedSpecifications->position;
});

Я надеюсь, что моего английского достаточно, чтобы описать мою проблему.Надеюсь, что некоторые из вас, ребята, могут помочь мне или, по крайней мере, показать правильный путь.

Кроме того, я понимаю, что сортировка коллекции выполняется очень медленно, тогда orderBy, может быть, будет лучше, если вы приведете пример с помощью orderBy, а не sortBy?

1 Ответ

0 голосов
/ 03 июня 2019

Вы можете сортировать по цепочке, чтобы достичь этого

$products->sortBy(function($q){
    return $q->relatedProduct->relatedSpecifications->position;
})->sortBy(function($q){
    return $q->relatedProduct->relatedSpecifications->somethingelse;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...