Octobercms上的前端结果不遵守数组顺序

问题描述 投票:0回答:2

我正在使用带有中继器字段的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];

有没有一种方法可以使其尊重数组顺序?

octobercms octobercms-backend october-form-controller october-partial
2个回答
0
投票

取决于您的订购方式。使用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']]

0
投票

如果使用的是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]

如有任何疑问,请发表评论

© www.soinside.com 2019 - 2024. All rights reserved.