Сортировать отношение ManyToMany по столбцу объединенной таблицы - PullRequest
1 голос
/ 10 мая 2019

Можно ли упорядочить отношение 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;
}

Я хотел бы сделать что-то вроде @OrderBy({"CategoryTranslation.name" = "ASC") в сущности Product.Или есть способ выполнить метод репозитория в аннотации @ManyToMany, чтобы вручную построить запрос для выбора категорий в правильном порядке?

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Я наконец решил это так, как @ehymel описал в своем ответе, но я использую метод uasort объекта ArrayIterator.Я не очень доволен этим решением, потому что в методе получения используется дополнительный параметр $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));
}
1 голос
/ 10 мая 2019

Не уверен, что вы можете сделать это с помощью аннотаций, но я достиг результата, которого вы ищете, с помощью простой функции uasort. В вашей Product сущности попробуйте что-то вроде следующего для вашего getCategories() getter.

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;
}
...