4

カスタマイズされた結合クエリを渡すときに、問題のバンドルの種類に問題があります。私の主な目的は、20 の結果のページネーションが 30 を超えるクエリを実行するときに実行されるクエリを減らすことです。

しかし、他のさまざまなテーブルを結合する事前定義されたクエリを使用すると、「通常」は 2 つのクエリに削減されます。もちろん、パフォーマンスが低下することはありません。

KnpPaginatorBundle で問題が発生します。ここでは、同じクエリを 30 個のクエリで実行しているようです。

コントローラ

public function indexAction(Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $form = $this->createForm(new SoundFilterType());
    if (!is_null($response = $this->saveFilter($form, 'sound', 'sound'))) {
        return $response;
    }

    $qb = $em->getRepository('AcmeSoundBundle:Soundtrack')->findAllJoin();
    $paginator = $this->filter($form, $qb, 'sound');


    return array(
        'form' => $form->createView(),
        'paginator' => $paginator,
    );
}

/**
 * @param QueryBuilder $qb
 * @param string       $name
 */
protected function addQueryBuilderSort(QueryBuilder $qb, $name)
{
     $alias = current($qb->getDQLPart('from'))->getAlias();
     if (is_array($order = $this->getOrder($name))) {
         $qb->orderBy($alias . '.' . $order['field'], $order['type']);
     }
}

/**
 * Filter form
 *
 * @param  FormInterface  $form
 * @param  QueryBuilder   $qb
 * @return SlidingPagination
 */
protected function filter(FormInterface $form, QueryBuilder $qb, $name)
{
    if (!is_null($values = $this->getFilter($name))) {
       if ($form->bind($values)->isValid()) {
           $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form, $qb);
       }
    }

    $count = $this->getDoctrine()->getManager()
                ->createQuery('SELECT COUNT(c) FROM AcmeSoundBundle:Sound c')
                ->getSingleScalarResult();

    // possible sorting
    $this->addQueryBuilderSort($qb, $name);
    return $this->get('knp_paginator')->paginate($qb->getQuery()->setHint('knp_paginator.count', $count), $this->getRequest()->query->get('page', 1), 20, array('distinct' => false));

}

クエリ

public function findAllJoin()
{        
     $qb = $this->createQueryBuilder('q');
     $query = $qb->select('u')
          ->from('AcmeSoundBundle:Sound', 'u')
          ->innerJoin('u.artists', 'a')
          ->leftJoin('u.versions', 'v')
          ->leftJoin('v.instruments', 'i')
          ->addOrderBy('u.dataIns', 'ASC');
}

ここに要旨があります https://gist.github.com/Lughino/6358896

クエリを使用しない理由がわかりません..

何か案が?

編集:

この問題について、次のエラーが見つかりました。

public function findAllJoin()
{        
    $qb = $this->createQueryBuilder('q');
    $query = $qb->select('u, a, v, i')
      ->from('AcmeSoundBundle:Sound', 'u')
      ->innerJoin('u.artists', 'a')
      ->leftJoin('u.versions', 'v')
      ->leftJoin('v.instruments', 'i')
      ->addOrderBy('u.dataIns', 'ASC');
}

代わりは:

public function findAllJoin()
{        
    $qb = $this->createQueryBuilder('q');
    $query = $qb->select('u')
      ->from('AcmeSoundBundle:Sound', 'u')
      ->innerJoin('u.artists', 'a')
      ->leftJoin('u.versions', 'v')
      ->leftJoin('v.instruments', 'i')
      ->addOrderBy('u.dataIns', 'ASC');
}

問題は、並べ替える列を選択すると結果が 1 つしか表示されず、並べ替えに失敗しても、実際には結果がまったく並べ替えられないことです。

足りないものはありますか?

EDIT2

解決しました!私が設定した場合、私の2つはからインスタンス化され、そのためにめちゃくちゃになります! この上:

public function findAllJoin()
{        
   $qb = $this->createQueryBuilder('u');
   $query = $qb->select('u, a, v, i')
               ->innerJoin('u.artists', 'a')
               ->leftJoin('u.versions', 'v')
               ->leftJoin('v.instruments', 'i')
               ->addOrderBy('u.dataIns', 'ASC');
}

問題は解決された!

4

0 に答える 0