如何使用KnpPaginator paginate()方法排序

时间:2019-03-04 23:35:21

标签: php symfony doctrine-orm symfony4 knppaginator


我正在尝试使用KnpPaginator对一些数据进行排序,但是没有如何使用“选项”数组的示例。
现在,我通过将数据传递给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列之一进行排序但要按Service->getType()->getName()属性对其进行排序时,它完全可以正常工作。
服务具有类型属性,该属性是与ServiceType的ManyToOne关系。
ServiceType使用可翻译的DoctrineBehaviors,因此列名称属于名为ServiceTypeTranslation的其他对象。
我想使用其全部功能而不必自己编写DQL,但是当我尝试命名“ type.name”之类的排序时,出现此列不存在的错误。
急于加载将无济于事,因为它仅连接1个表,而“ name”属性的转换位于Service的2个表中。
我知道我可以尝试将$ options数组用作paginate()的第4个参数,但无法正常工作。
有任何想法吗?在实体的某些部分下方进行可视化。

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;

...

为了记录起见,我尝试根据paginate()方法说明中的内容,使用这样的分页器,但它甚至无法工作。
没有任何地方可以使用$ whitelist数组的示例,至少我找不到它们。

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

第四个参数的phpdoc说:

 * @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

0 个答案:

没有答案