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

On Octobercms frontend results does't respect array order

我正在使用带有转发器字段的 yaml 文件 select 后端的某些类别。

然后在部分我使用:

$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]。所以一个 Laravel 集合有 [0, 1, 2] 你可以使用 ->sortBy 方法来切换哪个模型实例攻击索引。

所以您可能有一个包含名称字段的模型。您的第一个记录名称是 John,最后一个名称是 Adam。 Twig 会将 John 展示给 Adam。使用 ->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 = [4,5,1,3];
$sortedCategories = \...\..\Category::whereIn('id', $categories)
    ->orderByRaw(\DB::raw("FIELD(id," . implode(',', $categories) .  ")"))
    ->get();

it will created sort on FIELD(id, 4,5,1,3) assuming $categories = [4,5,1,3] and your records will be sorted like that.

客户端

Or if you are using SQlite then FIELD sort is not available. alternatively if you have small amount of records you can sort it 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]

如有疑问请评论