6

ページに表示するアイテムのリストがあり、その上に検索フォームがあり、通常のバックエンドと同様に、これらのアイテムをフィルタリングできます。問題は、結合を使用して既存のクエリに検索条件を追加する方法がわからないことです...これが私が持っているものです:

エンティティに関連付けられたリポジトリで特定のメソッドを使用して、クエリに結合を追加します(多くのクエリを回避するため)。コントローラは次のようになります。

class ModelController extends Controller
{
    public function indexAction(Request $request)
    {
        // ...
        $em = $this->getDoctrine()->getManager();
        $query = $em->getRepository('AcmeDemoBundle:Item')->getList();
    }
}

リポジトリのgetListメソッドは次のようになります。

use Doctrine\ORM\EntityRepository;

// ...

class ItemRepository extends EntityRepository
{
    public function getList()
    {
        $queryBuilder = $this
            ->createQueryBuilder('i')
            ->innerJoin('i.brand', 'b');

        return $queryBuilder->getQuery();
    }
}

ItemSearchTypeアイテムを検索するためのいくつかのフィールドを持つフォームオブジェクトを作成しました。

検索フォームに表示されたデータから検索条件を簡単に追加して、フィルタリングされたアイテムを表示するにはどうすればよいですか?

これは、検索フォームに関する私のコントローラーの内容です。

class ModelController extends Controller
{
    public function indexAction(Request $request)
    {

        // ...
        if ($request->getMethod() === 'POST') {
           $searchForm->bindRequest($request);

           if ($searchForm->isValid()) {
               $searchCriteria = $searchForm->getData();

              // Do something with this data! ...but I don't know how
           }
     }
}

ありがとう!

4

2 に答える 2

10

これが私が試すことです:

public function getListBy($criteria)
{
    $qb = $this->createQueryBuilder('i');

    $qb->innerJoin('i.brand', 'b');

    foreach ($criteria as $field => $value) {
        if (!$this->getClassMetadata()->hasField($field)) {
            // Make sure we only use existing fields (avoid any injection)
            continue;
        }

        $qb ->andWhere($qb->expr()->eq('i.'.$field, ':i_'.$field))
            ->setParameter('i_'.$field, $value);
    }

    return $qb->getQuery()->getResult();
}
于 2012-07-12T22:09:01.047 に答える
2

ここで私はこれに対する答えを投稿しました。私はLexikFormFilterBundlefilterTypesとQueryBuilderに加えて、filterForm作成プロセスを抽象化するために作成したTypeGuesserを使用します。

Composerを使用して、両方のサービスを別々のバンドルとしてインストールできます。結果のコードはよりクリーンになります

READMEから、githubに移動したくない場合:P

/**
 * Creates a Filter form to search for Entities.
 *
 * @param AbstractType|string $formType The `generate:doctrine:form` generated Type or its FQCN.
 *
 * @return \Symfony\Component\Form\Form The filter Form
 */
private function createFilterForm($formType)
{
    $adapter = $this->get('dd_form.form_adapter');
    $form = $adapter->adaptForm(
        $formType,
        $this->generateUrl('document_search'),
        array('fieldToRemove1', 'fieldToRemove2')
    );
    return $form;
}

SF>=2.8では壊れていますここ で修正が必要です

于 2014-04-10T20:42:27.323 に答える