Распечатка Admin Sonata: сортировка по количеству элементов в коллекции один ко многим - PullRequest
0 голосов
/ 05 апреля 2020

Я использую Sonata Admin, чтобы показать список участников с количеством предложений в отношениях OneToMany. Проблема с сортировкой по количеству предложений. Я не вижу в документации Sonata Admin способа сделать это. Некоторые ответы на подобные вопросы не работают.

/**
 * @ORM\Entity(repositoryClass="App\Repository\ClientRepository")
 */
class Member
{
    /**
     * @var int
     *
     * @ORM\Id()
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(type="text", nullable=false)
     */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="Offer", mappedBy="member")
     */
    private $offers;


    public function getOffersCount(): int
    {
        return $this->offers->count();
    }
}
/**
 * @ORM\Entity(repositoryClass="App\Repository\OfferRepository")
 */
class Offer
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var Collection
     *
     * @ORM\ManyToOne(targetEntity="Member", inversedBy="offers", cascade={"persist"})
     */
    private $member;
}
// MemberAdmin.php
protected function configureQuery(ProxyQueryInterface $query): ProxyQueryInterface
{
        $query = parent::configureQuery($query);

        $parameters = $this->getFilterParameters();


        if ('offersCount' === $parameters['_sort_by']) {
            $rootAlias = $query->getRootAliases()[0];

            $query
                ->addSelect('COUNT(o.id) as HIDDEN v_id_count')
                ->leftJoin($rootAlias.'.offers', 'of')
                ->groupBy($rootAlias.'.id')
                ->orderBy('v_id_count', $parameters['_sort_order']);
        }

        return $query;
}

protected function configureListFields(ListMapper $listMapper)
{
        $listMapper->addIdentifier('name', null, [
            'label' => 'Name',
            'sortable' => true
        ]);
        $listMapper->add('offersCount', IntegerType::class, [
            'sort_field_mapping' => ['fieldName' => 'id'],
            'mapped' => false,
            'sortable' => true,
            'sort_parent_association_mappings' => [],
        ]);
}

С данным кодом у меня возникает ошибка, когда я нажимаю на стрелку сортировки в списке:

Исключение было выдано во время рендеринга шаблон ("[Семантическая ошибка] строка 0, столбец 101 рядом с 'v_id_count A': ошибка: 'v_id_count' не определено.").

Соната была выполнена этим sql:

ВЫБЕРИТЕ DISTINCT o.id ИЗ ПРИЛОЖЕНИЯ \ Entity \ Client o СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ o.offer of GROUP BY o.id ЗАКАЗАТЬ o.id AS C, v_id_count AS C

Что я должен изменить, чтобы сортировка работала?

...