是否可以通过带有注释的实体中的联接表的列来排序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
批注中的存储库方法来手动构建查询以选择顺序正确的类别?
答案 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));
}