我需要像这样https://www.bodybuilding.com/store/listing.htm
对数据库中的集合进行排序我可以写它,但是我可能也会失去不理想的雄辩的关系。
这感觉就像Laravel可以开箱即用,或者逻辑很少。
有什么建议吗?
答案 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