0

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

有没有办法让它尊重数组顺序?

4

2 回答 2

3

如果您使用的是 mysql,则可以根据您传递 id 的顺序轻松自定义顺序。

$categories = [4,5,1,3];
$sortedCategories = \...\..\Category::whereIn('id', $categories)
    ->orderByRaw(\DB::raw("FIELD(id," . implode(',', $categories) .  ")"))
    ->get();

它会在FIELD(id, 4,5,1,3)假设下创建排序$categories = [4,5,1,3],您的记录将像这样排序。

客户端

或者,如果您正在使用SQlitethen 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]

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

于 2020-06-05T07:56:21.623 回答
0

取决于您如何订购。使用 Laravel 集合对数组进行排序。Twig 将打印升序优先数字索引。[5,4,2,3,1]总是会出来[1,2,3,4,5]。因此,一个拥有你的 Laravel 集合[0, 1, 2]可以使用该->sortBy方法来切换哪个模型实例被攻击到索引。

因此,您可能有一个包含名称字段的模型。你的第一张唱片的名字是约翰,最后一张是亚当。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']]
于 2020-06-04T20:38:34.947 回答