【问题标题】:Sorting a Doctrine ArrayCollection by a specific, custom field按特定的自定义字段对 Doctrine ArrayCollection 进行排序
【发布时间】:2019-04-01 03:59:03
【问题描述】:

我正在尝试按特定字段对ArrayCollection 进行排序。 ArrayCollection 是一系列课程。在Course 实体中有一个名为isLive 的方法,它返回一个布尔值。

我想对这个集合进行排序,使“实时”课程位于数组的开头,这就是从 isLive 调用返回 true 的课程。

这是我目前拥有的代码,但$sorted数组中的第一个条目是非直播课程。

$iterator = $this->courses->getIterator();
$iterator->uasort(function ($a, $b) {
   if ($a->isLive() == $b->isLive()) {
      return 0;
   }
   return ($a->isLive() < $b->isLive()) ? -1 : 1;
});
$sorted = new ArrayCollection(iterator_to_array($iterator));

【问题讨论】:

    标签: arrays symfony sorting doctrine php-7.2


    【解决方案1】:

    对于实体,执行以下操作:向属性添加 OrderBy 注释。

    /**
     * @OneToMany(targetEntity="Course")
     * @OrderBy({"live": "ASC"})
     */
    private $courses;
    

    【讨论】:

      【解决方案2】:

      它看起来像是 Doctrine Criteria 的一个很好的用例。它们允许对 ArrayCollections 进行过滤/排序,如果集合已加载,则在内存中,或者在下次从数据库加载集合时添加 WHERE / ORDER BY SQL 子句。所以这是相当优化的!

      假设您在isLive() 后面有一个live 字段,代码应该如下所示:

      $criteria = Criteria::create()
          ->orderBy(["live" => Criteria::DESC])
      ;
      
      $sorted = $this->courses->matching($criteria);
      

      【讨论】:

        【解决方案3】:

        我找到了使用uasortarray_search 的解决方案,如下所示:

        /**
         * @return ArrayCollection
         */
        public function getCoursesSortedByLive(): ArrayCollection
        {
            $coursesIterator = $this->courses->getIterator();
        
            $sortOrder = [true];
        
            $coursesIterator->uasort(function ($a, $b) use ($sortOrder) {
                return array_search($a->isLive(), $sortOrder) - array_search($b->isLive(), $sortOrder);
            });
        
            return new ArrayCollection(iterator_to_array($sitesIterator));
        }
        

        【讨论】:

          猜你喜欢
          • 2014-07-21
          • 1970-01-01
          • 2012-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-30
          • 2021-06-26
          • 2020-03-29
          相关资源
          最近更新 更多