Я пытаюсь отсортировать некоторые данные с помощью 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