как сортировать, используя метод KnpPaginator paginate () - PullRequest
0 голосов
/ 05 марта 2019


Я пытаюсь отсортировать некоторые данные с помощью KnpPaginator, но нет примера использования массива «options».
Пока я сортирую данные, передавая их самому findBy, но яне может сортировать по атрибуту подобъекта таким образом.

$this->limit    = $request->query->getInt('limit', $container->getParameter('pagination.default_limit'));
$this->page     = $request->query->getInt('page', 1);
$sortColumn     = $this->camelcase($request->query->get('sort', 'id'));
$sortDirection  = $request->query->get('direction', 'asc');
$this->sort     = array($sortColumn => $sortDirection);
$this->list     = $this->getRepo(Service::class)->findBy(
    array('user' => $this->getUser()->getId()),
    $this->sort   
);
$pagination = $this->get('knp_paginator')->paginate(
    $this->list,
    $this->page,
    $this->limit
);

Это работает совершенно нормально, когда я хочу отсортировать по одному из столбцов службы, но я хочу отсортировать его по свойству Service->getType()->getName().
Служба имеет свойство типа, которое является отношением ManyToOne к ServiceType.
ServiceType использует DoctrineBehaviors Transurable, поэтому имя столбца принадлежит другому объекту с именем ServiceTypeTranslation.
Я бы хотел использовать его полную функциональность без необходимости писать DQL сам, нокогда я пытаюсь назвать сортировку как «type.name», я получаю сообщение об ошибке, что этот столбец не существует.
Стремительная загрузка не поможет, поскольку она объединяет только 1 таблицу, а перевод для свойства «name» находится на 2 таблицы глубже отСлужба.
Я знаю, что могу попробовать использовать массив $ options в качестве 4-го аргумента для paginate (), но не могу заставить его работать.
Есть идеи?Ниже приведены некоторые части сущностей для визуализации.

Service.php

/**
 * @ORM\Table
 * @ORM\Entity
 */
class Service
{

...

    /**
     * @ORM\ManyToOne(targetEntity="DictServiceType", fetch="EAGER")
     * @ORM\JoinColumn(referencedColumnName="id", nullable=false)
     */
    private $type;

...

ServiceType.php

/**
 * @ORM\Table
 * @ORM\Entity
 */
class DictServiceType
{
    use ORMBehaviors\Translatable\Translatable;

...


    /**
     * @return mixed
     */
    public function getName()
    {
        return $this->translate(null, false)->getName();
    }

...

ServiceTypeTranslation.php

/**
 * @ORM\Table
 * @ORM\Entity
 */
class DictServiceTypeTranslation
{
    use ORMBehaviors\Translatable\Translation;

    /**
     * @var string
     *
     * @ORM\Column(type="string", length=255)
     */
    private $name;

...

Для записи я попытался использовать paginator, как это, основываясь на том, что я прочитал в описании метода paginate (), но он даже не близок к работе.
Нет примеров того, как использовать белый список $массив где угодно, по крайней мере я не смог их найти.

$pagination = $this->get('knp_paginator')->paginate(
            $this->list,
            $this->page,
            $this->limit,
            array(
                array(
                    $this->sort
                )
            )
        );

И phpdoc для этого 4-го аргумента говорит:

 * @param array $options - less used options:
 *     boolean $distinct - default true for distinction of results
 *     string $alias - pagination alias, default none
 *     array $whitelist - sortable whitelist for target fields being paginated
...