代码之家  ›  专栏  ›  技术社区  ›  vimuth

knppaginator不适用于联接表

  •  1
  • vimuth  · 技术社区  · 6 年前

    我正在尝试将两个表连接起来,并从knppaginator获取排序结果集。这是我的密码。

    视图

    <table class="table table-bordered">
           <tr>
                <th>{{ knp_pagination_sortable(pagination, 'Id', 'c.id') }}</th>
                <th{% if pagination.isSorted('c.name') %} class="sorted"{% endif %}>{{ knp_pagination_sortable(pagination, 'Name', 'c.name') }}</th>
                <th>{{ knp_pagination_sortable(pagination, 'Version', 'c.model.name') }}</th>
           </tr>
           {% for article in pagination %}
               <tr {% if loop.index is odd %}class="color"{% endif %}>
                   <td>{{ article.id }}</td>
                   <td>{{ article.getName }}</td>
                   <td>{{ article.model.name }}</td>
               </tr>
            {% endfor %}
    </table>
    

    控制器

    $em = $this->get('doctrine.orm.entity_manager');
            $dql = "SELECT c FROM App\Entity\Car c";
            $query = $em->createQuery($dql);
    
            $paginator = $this->get('knp_paginator');
            $pagination = $paginator->paginate(
                    $query, /* query NOT result */ $request->query->getInt('page', 1)/* page number */, 10/* limit per page */
            );
    

    模型模型

    /**
     * @ORM\Entity(repositoryClass="App\Repository\ModelRepository")
     */
    class Model
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
    
        /**
    

    汽车模型

    <?php
    
    namespace App\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity(repositoryClass="App\Repository\CarRepository")
     */
    class Car
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
    
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $name;
    
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $code;
    
        /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Model",cascade={"refresh","merge"}, inversedBy="cars")
         * @ORM\JoinColumn(nullable=false)
         */
        private $model;
    
        public function getModel(): ?Model
        {
            return $this->model;
        }
    
        public /**
     * @param $
     */function setModel(?Model $model): self
        {
            $this->model = $model;
    
            return $this;
        }
    }
    

    当我在表体内得到article.model.name时,它就工作了。但是 knp_pagination_sortable(pagination, 'Version', 'c.model.name') 仅显示此错误

    在给定的查询组件中没有这样的字段[model.name], 别名由[C]

    为了提高可见性,我删除了一些不需要的代码。谢谢

    1 回复  |  直到 6 年前
        1
  •  0
  •   vimuth    6 年前

    终于找到了解决办法。

        $em = $this->get('doctrine.orm.entity_manager');
        $qb = $em->createQueryBuilder();
    
        $query = $qb->select('c', 'm')
                ->from('App\Entity\Car', 'c')
                ->leftJoin('c.model', 'm')
                ->getQuery();
    
        $paginator = $this->get('knp_paginator');
        $pagination = $paginator->paginate(
                $query, /* query NOT result */ $request->query->getInt('page', 1)/* page number */, 10/* limit per page */
        );
    

    但是你需要正确的人际关系来完成我在这里补充的,

    /**
         * @ORM\ManyToOne(targetEntity="App\Entity\Model",cascade={"refresh","merge"}, inversedBy="cars")
         * @ORM\JoinColumn(nullable=false)
         */
        private $model;
    
        public function getModel(): ?Model
        {
            return $this->model;
        }
    
        public /**
     * @param $
     */function setModel(?Model $model): self
        {
            $this->model = $model;
    
            return $this;
        }