【问题标题】:On Octobercms frontend results does't respect array order在 Octobercms 前端结果不尊重数组顺序
【发布时间】:2020-09-23 19:55:51
【问题描述】:

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


    【解决方案1】:

    取决于您的订购方式。使用 Laravel 集合对数组进行排序。 Twig 将打印升序优先数字索引。 [5,4,2,3,1] 将始终以 [1,2,3,4,5] 出现。所以一个有 [0, 1, 2] 的 Laravel 集合你可以使用 ->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']]
    

    【讨论】:

      【解决方案2】:

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

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

      假设$categories = [4,5,1,3],它将在FIELD(id, 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]
      

      如有疑问请留言

      【讨论】:

      • 我使用转发器字段来创建类别数组。然后我通过拖动更改转发器字段上的类别顺序。我看到数组顺序发生了变化,但结果总是一样的。我如何在客户端尊重转发器顺序对其进行排序?我尝试 ->orderBy() 但我找不到尊重转发器字段顺序的方法。
      • 我发布了代码以在客户端对其进行排序,请检查。第二个代码
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 2017-08-13
      • 2016-10-13
      • 1970-01-01
      相关资源
      最近更新 更多