将雄辩的集合按字母顺序排序的优雅方法

时间:2018-12-13 16:18:04

标签: php laravel eloquent

我需要像这样https://www.bodybuilding.com/store/listing.htm

对数据库中的集合进行排序

我可以写它,但是我可能也会失去不理想的雄辩的关系。

这感觉就像Laravel可以开箱即用,或者逻辑很少。

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

假设一个名为Categories的模型具有一个字段name,则需要按类别名称的首字母对类别进行分组。每个带有第一个字母而不是字母的类别将被分组在“#”符号下:

$collection = Categories::get();
$grouped = $collection->groupBy(function ($item, $key) {
    $letter = $item->name[0];
    if (ctype_alpha($letter)) {
        return $letter;
    }
    return '#';
});

答案 1 :(得分:0)

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

答案 2 :(得分:0)

看起来像普通的foreach()就足够了

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

上面的代码生成了一个以字母为键的assoc数组-并将所有非alpha项放在另一个

答案 3 :(得分:-1)

查看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