【问题标题】:Conditionally sorting for an even distribution of records有条件地排序以实现记录的均匀分布
【发布时间】:2020-11-25 06:10:17
【问题描述】:

假设我在这样的Item 模型中有 10 条 Eloquent 模型记录(为简单起见,表示为 JSON):

[
  {id: 1, name: 'Item 1', featured: false},
  {id: 2, name: 'Item 2', featured: true},
  {id: 3, name: 'Item 3', featured: false},
  {id: 4, name: 'Item 4', featured: false},
  {id: 5, name: 'Item 5', featured: false},
  {id: 6, name: 'Item 6', featured: false},
  {id: 7, name: 'Item 7', featured: true},
  {id: 8, name: 'Item 8', featured: false},
  {id: 9, name: 'Item 9', featured: false},
  {id: 10, name: 'Item 10', featured: true},
]

我想首先通过id 升序组织此列表,然后分配记录,这样featured = false 的每两条记录后跟featured = true 的一条记录。

结果如下所示:

[
  {id: 1, name: 'Item 1', featured: false},
  {id: 3, name: 'Item 3', featured: false},
  {id: 2, name: 'Item 2', featured: true},
  {id: 4, name: 'Item 4', featured: false},
  {id: 5, name: 'Item 5', featured: false},
  {id: 7, name: 'Item 7', featured: true},
  {id: 6, name: 'Item 6', featured: false},
  {id: 8, name: 'Item 8', featured: false},
  {id: 10, name: 'Item 10', featured: true},
  {id: 9, name: 'Item 9', featured: false},
]

我将如何使用 Eloquent 集合或查询来做到这一点?

【问题讨论】:

    标签: laravel sorting eloquent laravel-8


    【解决方案1】:

    这是一个使用集合的工作解决方案(我相信它可以清理很多):

    $result = collect($items)->sortBy('id')->partition(function ($i) {
      return $i['featured'];
    })->pipe(function ($groups) {
       return $groups->last()->chunk(2)->reduce(function ($carry, $item) use ($groups) {
          $item->each(function ($i) use ($carry) {
             $carry->push($i);
          });
          
          if ($groups->first()->isNotEmpty()) {
             $carry->push($groups->first()->shift());
          }
    
          return $carry;
       }, collect());
    });
    

    看到它在行动here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 2020-12-05
      • 2011-04-04
      • 2010-11-20
      • 2018-05-28
      • 1970-01-01
      • 2018-09-07
      相关资源
      最近更新 更多