Symfony 4 排序过滤数组集合
Symfony 4 Sorting Filtered Array Collection
我在对由已过滤的一对多关系产生的集合进行排序时遇到问题。我有一个有问题的测验:
class Quiz
{
/**
* One quiz has many questions. This is the inverse side.
* @ORM\OneToMany(targetEntity="Question", mappedBy="assessment")
* @ORM\OrderBy({"num" = "ASC"})
*/
private $questions;
public function __construct() {
$this->questions = new ArrayCollection();
}
这按预期工作。但是,当我修改 getter 以排除非活动(软删除)问题时,排序顺序丢失了。
public function getQuestions()
{
// filter to never return soft deleted questions
$criteria = Criteria::create()->where(Criteria::expr()->eq("active", true));
return $this->questions->matching($criteria);
}
事实上,有了这个 getter,如果我将 order by 子句修改为不存在的列,我不会像我预期的那样得到无法识别的字段异常:
@ORM\OrderBy({"nonexistantcolumn" = "ASC"})
这让我相信标准过滤以某种方式覆盖了注释。任何有关如何解决此问题的想法都将不胜感激。
除了过滤,Criteria
还可以sort一个集合:
public function getQuestions()
{
// filter to never return soft deleted questions
$criteria = Criteria::create()
->where(Criteria::expr()->eq("active", true))
->orderBy(["num" => Criteria::ASC]);
return $this->questions->matching($criteria);
}
但是,请考虑添加另一个未过滤的 getter,因为这会阻止您实际删除非活动元素,或将此逻辑移至存储库方法。
我在对由已过滤的一对多关系产生的集合进行排序时遇到问题。我有一个有问题的测验:
class Quiz
{
/**
* One quiz has many questions. This is the inverse side.
* @ORM\OneToMany(targetEntity="Question", mappedBy="assessment")
* @ORM\OrderBy({"num" = "ASC"})
*/
private $questions;
public function __construct() {
$this->questions = new ArrayCollection();
}
这按预期工作。但是,当我修改 getter 以排除非活动(软删除)问题时,排序顺序丢失了。
public function getQuestions()
{
// filter to never return soft deleted questions
$criteria = Criteria::create()->where(Criteria::expr()->eq("active", true));
return $this->questions->matching($criteria);
}
事实上,有了这个 getter,如果我将 order by 子句修改为不存在的列,我不会像我预期的那样得到无法识别的字段异常:
@ORM\OrderBy({"nonexistantcolumn" = "ASC"})
这让我相信标准过滤以某种方式覆盖了注释。任何有关如何解决此问题的想法都将不胜感激。
除了过滤,Criteria
还可以sort一个集合:
public function getQuestions()
{
// filter to never return soft deleted questions
$criteria = Criteria::create()
->where(Criteria::expr()->eq("active", true))
->orderBy(["num" => Criteria::ASC]);
return $this->questions->matching($criteria);
}
但是,请考虑添加另一个未过滤的 getter,因为这会阻止您实际删除非活动元素,或将此逻辑移至存储库方法。