Php 将雄辩的收藏按字母顺序分块的优雅方式

Php 将雄辩的收藏按字母顺序分块的优雅方式,php,laravel,eloquent,Php,Laravel,Eloquent,我需要像这样对数据库中的集合进行排序 我可以写,但我可能也会失去那些不理想的雄辩的关系 这感觉像是Laravel可以开箱即用的东西,或者用很少的逻辑 有什么建议吗?查看Laravel文档 如果您需要更具体的内容,您可以始终创建范围,并在雄辩的模型中使用这些范围。 假设一个名为Categories的模型带有一个字段name,您需要根据类别名称的第一个字母对其进行分组。第一个字母不是字母字符的每个类别将分组在“#”符号下: mapToGroups就是我要找的。这是我的解决办法 public fun

我需要像这样对数据库中的集合进行排序

我可以写,但我可能也会失去那些不理想的雄辩的关系

这感觉像是Laravel可以开箱即用的东西,或者用很少的逻辑


有什么建议吗?

查看Laravel文档

如果您需要更具体的内容,您可以始终创建
范围
,并在雄辩的模型中使用这些范围。

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


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;
}
上面生成一个以字母为键的assoc数组,并将所有非alpha项放入other

Check-into以对集合进行排序。为了添加新的标题,您可能必须添加第一个字母更改的检查。
orderAndGroupByFirstLetter()
(这就是您所描述的)实际上没有“开箱即用”的解决方案,但是作为查询结果的Laravel集合有很多方法可以处理这个问题,例如
sortBy()。
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);
}
$ordered = [];
foreach ($items as $item) {
    $key = ctype_alpha($item->attribute[0]) ? $item->attribute[0] : 'other';
    $ordered[$item->attribute[0]][] = $item;
}