通过联接表的列对ManyToMany关系进行排序

时间:2019-05-09 22:23:22

标签: php symfony annotations doctrine

是否可以通过带有注释的实体中的联接表的列来排序ManyToMany关系?

我已经尝试使其与@ORM\JoinTable@ORM\JoinColumn一起使用,但这似乎不起作用。

class Product {
    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Category")
     * @ORM\OrderBy({"name" = "ASC"})
     */
    private $categories;
}
class Category {
    use Knp\Translatable;
}
class CategoryTranslation {
    use Knp\Translation;
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;
}

我想在Product实体中执行类似@OrderBy({"CategoryTranslation.name" = "ASC")的操作。还是有一种方法可以执行@ManyToMany批注中的存储库方法来手动构建查询以选择顺序正确的类别?

2 个答案:

答案 0 :(得分:1)

不确定您可以通过注释来做到这一点,但是我已经通过简单的Product函数达到了您想要的结果。在您的getCategories()实体中,为您的public function getCategories() { $categories = $this->categories; uasort($catetories, [$this, 'mySortCategories']); return $categories; } private function mySortCategories(Category $cat1, Category $cat2) { if ($cat1->getName() === $cat2->getName()) { return 0; } return ($cat1->getName() < $cat2->getName()) ? -1 : 1; } 吸气剂尝试以下操作。

{{1}}

答案 1 :(得分:1)

我终于按照@ehymel在他的回答中描述的方式解决了它,但是我正在使用ArrayIterator对象的uasort方法。我对此解决方案不太满意,因为在getter方法中使用了额外的$locale参数,我希望使用SQL / DQL来订购商品,而不希望使用额外的PHP循环。但是目前它是可行的。

public function getCategories(?string $locale = null)
{
    $iterator = $this->categories->getIterator();
    $iterator->uasort(function (Category $a, Category $b) use ($locale) {
        return ($a->translate($locale)->getName() < $b->translate($locale)->getName()) ? -1 : 1;
    });

    return new ArrayCollection(iterator_to_array($iterator));
}