Элегантный способ сортировки красноречивой коллекции по алфавиту - PullRequest
0 голосов
/ 13 декабря 2018

Мне нужно отсортировать коллекцию из моей базы данных следующим образом: https://www.bodybuilding.com/store/listing.htm

Я мог бы написать ее, но я, вероятно, также потерял бы красноречивые отношения, которые не идеальны.

Это похоже на то, что Laravel может что-то сделать из коробки или с очень малой логикой

Есть предложения?

Ответы [ 4 ]

0 голосов
/ 13 декабря 2018

Похоже, что обычного foreach() будет достаточно

$ordered = [];
foreach ($items as $item) {
    $key = ctype_alpha($item->attribute[0]) ? $item->attribute[0] : 'other';
    $ordered[$item->attribute[0]][] = $item;
}

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

0 голосов
/ 13 декабря 2018

Предполагается, что модель называется Categories с полем name, и вам нужно сгруппировать категории по первой букве их имени.Каждая категория с первой буквой, которая не является буквенным символом, будет сгруппирована под символом «#»:

$collection = Categories::get();
$grouped = $collection->groupBy(function ($item, $key) {
    $letter = $item->name[0];
    if (ctype_alpha($letter)) {
        return $letter;
    }
    return '#';
});
0 голосов
/ 13 декабря 2018

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);
}
0 голосов
/ 13 декабря 2018

Оформление документации 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...