如何使用Symfony2实现搜索过滤器表单

时间:2012-07-12 10:23:46

标签: php doctrine-orm symfony-2.1

我有一个要在页面上显示的项目列表,其上方有一个搜索表单来过滤这些项目,就像在任何通常的后端一样。问题是我不知道如何将搜索条件添加到带有连接的现有查询...这就是我所拥有的:

我在与实体关联的存储库中使用特定方法来在查询上添加联接(以避免许多查询)。控制器如下所示:

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
           }
     }
}

谢谢!

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:2)

在这里,我为此发布了answer,我使用了LexikFormFilterBundle filterTypes和QueryBuilder,以及我创建的TypeGuesser,它抽象了filterForm的创建过程。

您可以将这两种服务作为单独的捆绑包与Composer一起安装。生成的代码更清晰

如果您不想导航到github:P

,请从README中
/**
 * 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 打破了 需要修复here