我正在使用带有中继器字段的yaml文件来选择后端的某些类别。
然后在部分我使用:
$categories = \...\..\Category::whereIn('id', $categories)->get();
$this['categories'] = $categories;
然后在正面使用:
{% for category in categories%}
{{ category.name }}
{% endfor %}
一切正常,我在前端获得了数组变量$ categories的所有类别。问题是,不管我是否更改数组顺序,结果顺序总是相同的。例如这个数组:
$categories = [1, 2, 3, 4, 5];
使用此数组给出相同的顺序结果:
$categories = [4, 1, 2, 5, 3];
有没有一种方法可以使其尊重数组顺序?
取决于您的订购方式。使用Laravel集合对数组进行排序。 Twig将打印升序的优先数字索引。 [5,4,2,3,1]
将始终作为[1,2,3,4,5]
出现。因此,具有[0, 1, 2]
的Laravel集合可以使用->sortBy
方法来切换将哪个模型实例攻击到索引。
所以您可能有一个包含名称字段的模型。您的第一个唱片的名字叫约翰,最后一个叫亚当。特威格(Twig)将向约翰展示亚当(John)。使用->sortBy('name')
将按字母顺序显示升序列表。
[0=>['name'=>'John'], 1=>['name'=>'Zack'], 2=>['name'=>'Adam']]
//Using ->sortBy('name') becomes:
[0=>['name'=>'Adam'], 1=>['name'=>'John'], 2=>['name'=>'Zack']]
如果使用的是mysql,则可以轻松地根据传递ID的顺序自定义顺序。
$categories = \...\..\Category::whereIn('id', $categories)
->orderByRaw(\DB::raw("FIELD(id," . implode(',', $categories) . ")"))
->get();
假设
FIELD(id, 4,5,1,3)
,它将在$categories = [4,5,1,3]
上创建排序,并且您的记录将像这样排序。
或者如果您使用的是
SQlite
,则使用FIELD sort is not available
。或者,如果您有small amount of records
,则可以将其排序为client side using collection helper method sortBy
。
$category = [1,2,4,5,3];
$categories = \...\..\Category::whereIn('id', $categories)->get();
$sortedCategories = $categories
->sortBy(function ($item) use ($category) {
return array_search($item->id, $category);
});
dd($sortedCategories); // sorted based on $category = [1,2,4,5,3]
如有任何疑问,请发表评论