Соната admin - поле "order by" в соответствующей таблице

У меня есть класс администратора продукта. Сущность Product имеет отношение "многие к одному" с сущностью Category, то есть продукт связан с категорией.

На странице списка администраторов для продуктов мне нужно отсортировать по названию категории (в алфавитном порядке), с которым связан каждый продукт.

Установить поле по умолчанию для сортировки легко, если поле находится на самом объекте (см. Порядок комплектации администратора Sonata, как это сделать). Но я не могу понять, как сортировать по полю в связанной таблице.

Любая помощь приветствуется.

2 ответа

Решение

Это кажется обходным путем, но это работает. Вам нужно добавить метод createQuery(), переопределяющий объединение, а затем назначить переопределение $datagridValues ​​по умолчанию для sortBy:

<?php
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery;

class ExpenseAdmin extends Admin
{
    protected $datagridValues = array(
        '_page'       => 1,
        '_sort_order' => 'ASC', // sort direction
        '_sort_by' => 'c.name' // field name
    );

    /**
     * @return \Sonata\AdminBundle\Datagrid\ProxyQueryInterface
     */
    public function createQuery($context = 'list')
    {
        $query = parent::createQuery($context);

        return new ProxyQuery($query
            ->join(sprintf('%s.category', $query->getRootAlias()), 'c'));
    }
}

Предполагаю name является собственностью юридического лица Category по которому вы хотите отсортировать. Вы можете сделать это в себе ProductAdmin.php

protected function configureListFields(ListMapper $listMapper)
{

     $listMapper->add('category.name', null, array(
            'sortable' => true,
     ));
     ...
}

Таким образом, вы используете ссылки для упорядочивания в заголовке списка, созданного Sonata.

редактировать

Если вы также хотели бы иметь ссылку на название категории в списке продуктов для быстрого редактирования Category сущность, если вы создали CategoryAdmin класс, вы должны написать свой код следующим образом:

protected function configureListFields(ListMapper $listMapper)
{

     $listMapper->add('category', null, array(
            'sortable' => 'category.name',
     ));
     ...
}

И в твоем Category класс вы должны реализовать __toString() метод как это:

public function __toString()
{
    return $this->getName();
}
Другие вопросы по тегам