Мне нужно отсортировать коллекцию из моей базы данных, например, https://www.bodybuilding.com/store/listing.htm
Я мог бы написать это, но я, вероятно, также потеряю красноречивые отношения, которые не идеальны.
Это похоже на то, что Laravel что-то может сделать из коробки или с очень небольшой логикой.
Какие-либо предложения?
На самом деле нет готового решения для orderAndGroupByFirstLetter() (это то, что вы описываете), но коллекции Laravel, которые являются результатом запроса, имеют множество доступных методов для решения этой проблемы, например sortBy(). , filter(), mapToGroups() и т. д. Посмотрите, сможете ли вы написать что-нибудь, и задайте более конкретный вопрос, если у вас возникнут какие-либо проблемы.






Ознакомьтесь с документацией Laravel https://laravel.com/docs/5.7/eloquent#retrieving-models
$listing = App\Store::where('first_letter', 'a')
->orderBy('name', 'desc')
->take(10)
->get();
Если вам нужно что-то более конкретное, вы всегда можете создать Scopes и использовать его в своих красноречивых моделях.
https://laravel.com/docs/5.7/eloquent#query-scopes
Предположим, что модель называется Categories с полем name, и вам необходимо сгруппировать категории по первой букве их имени. Каждая категория, первая буква которой не является алфавитным символом, будет сгруппирована под символом '#':
$collection = Categories::get();
$grouped = $collection->groupBy(function ($item, $key) {
$letter = $item->name[0];
if (ctype_alpha($letter)) {
return $letter;
}
return '#';
});
mapToGroups - это то, что я искал. Вот мое решение.
public function chunkByAlpha(Collection $collection)
{
return $collection->mapToGroups(function($item, $key) {
return ($this->isAlpha($item->name[0]) ? [strtoupper($item->name[0]) => $item] : ['#' => $item]);
});
}
public function isAlpha($toCheck)
{
return preg_match("/^[a-zA-Z]+$/", $toCheck);
}
Вроде бы обычного foreach() хватило бы
$ordered = [];
foreach ($items as $item) {
$key = ctype_alpha($item->attribute[0]) ? $item->attribute[0] : 'other';
$ordered[$item->attribute[0]][] = $item;
}
Вышеупомянутый создает ассоциативный массив с буквой в качестве ключа - и помещает все элементы без альфа в другие
Зайдите в laravel.com/docs/master/collections#method-sortby, чтобы отсортировать вашу коллекцию. Вам, вероятно, придется добавить чек на изменение первой буквы, чтобы добавить новый заголовок.