Php Symfony2,如何使用下拉列表形式在条令中执行数据库检索?

Php Symfony2,如何使用下拉列表形式在条令中执行数据库检索?,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我有一个表单,它将执行搜索操作,其中包含要搜索的类别选择的下拉列表。下拉列表是要搜索的主题。因此: 搜索人: 1) 发票# 2) 追踪# 3) 基本法# 然后输入值并提交搜索 我有我的表格: // src Bundle\Form\Type\SearchType.php public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('kind', 'choice',

我有一个表单,它将执行搜索操作,其中包含要搜索的类别选择的下拉列表。下拉列表是要搜索的主题。因此:

搜索人: 1) 发票# 2) 追踪# 3) 基本法#

然后输入值并提交搜索

我有我的表格:

// src Bundle\Form\Type\SearchType.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('kind', 'choice', array(
            'choices' => array(
                'invoice' => 'Invoice #',
                'trackingno' => 'Tracking Number'
                'blno' => 'BL #',
            ),
            'label' => 'Search by: '
        ))
            ->add('value', 'text', array(
                'label' => false
            ))
            ->add('Submit','submit');
}
在控制器中使用此功能:

public function getForm() {

    $form = $this->createForm(new SearchType(), array(
            'action' => $this->generateUrl('search_view'),
            'method' => 'POST'
        ) );

    return $form;

}
将操作转到“搜索视图”功能:

/**
 * @param Request $request
 * @Route("/results/", name="search_view")
 */
public function searchAction(Request $request) {
    $kind = $request->get('kind');
    $value = $request->get('value');

    $em = $this->getDoctrine()->getManager();

    $findCfs = $em->getRepository("CFSBundle:Cfs")
            ->searchCfs($kind, $value);

    return $this->render("CFSBundle:Search:index.html.twig", array(
            'results' => $findCfs
        ));

}
我的问题是我不知道去哪里执行基于类别的数据库检索。这是存储库中的内容:

 public function searchCfs($kind, $value) {
    $query = $this->getEntityManager()
        ->createQuery('
            SELECT
                 c.blno, m.ctrno, c.carrier, m.refno
            FROM
                CFSBundle:Cfs c
            LEFT JOIN
                cfs.refno m
            WHERE
                :kind LIKE :value
            ')->setParameter("kind", $kind)
            ->setParameter("value", $value);

    try {
        return $query->getResult();
    } catch(\Doctrine\ORM\NoResultException $e) {
        return null;
    }
}
const KIND_INVOICE_NO = 'invoice';
const KIND_TRACKING_NO = 'tracking';
const KIND_BL_NO = 'blno';

public function searchCfs($kind, $value) {
    $queryBuilder = $this->createQueryBuilder('c')
        ->select('c.blno, m.ctrno, c.carrier, m.refno')
        ->leftJoin('cfs.refno', 'm');

    if ($kind === self::KIND_INVOICE_NO) {
        $queryBuilder->where('c.invoiceno = :queryValue');
    } elseif ($kind === self::KIND_TRACKING_NO) {
        $queryBuilder->where('m.ctrno = :queryValue')
    } elseif ($kind === self::KIND_BL_NO) {
        $queryBuilder->where('c.blno = :queryValue')
    }

    $queryBuilder->setParameter('queryValue', $value);

    $query = $queryBuilder->getQuery();

    try {
        return $query->getResult();
    } catch(\Doctrine\ORM\NoResultException $e) {
        return null;
    }
}

当然,这是行不通的。我曾考虑为每个类别创建不同的查询,并根据其类别提交条件,但我想知道是否有一个简单的解决方案?

我建议在编写此类查询时使用
QueryBuilder
类,而不是直接编写DQL

然后,您可以在存储库中执行以下操作:

 public function searchCfs($kind, $value) {
    $query = $this->getEntityManager()
        ->createQuery('
            SELECT
                 c.blno, m.ctrno, c.carrier, m.refno
            FROM
                CFSBundle:Cfs c
            LEFT JOIN
                cfs.refno m
            WHERE
                :kind LIKE :value
            ')->setParameter("kind", $kind)
            ->setParameter("value", $value);

    try {
        return $query->getResult();
    } catch(\Doctrine\ORM\NoResultException $e) {
        return null;
    }
}
const KIND_INVOICE_NO = 'invoice';
const KIND_TRACKING_NO = 'tracking';
const KIND_BL_NO = 'blno';

public function searchCfs($kind, $value) {
    $queryBuilder = $this->createQueryBuilder('c')
        ->select('c.blno, m.ctrno, c.carrier, m.refno')
        ->leftJoin('cfs.refno', 'm');

    if ($kind === self::KIND_INVOICE_NO) {
        $queryBuilder->where('c.invoiceno = :queryValue');
    } elseif ($kind === self::KIND_TRACKING_NO) {
        $queryBuilder->where('m.ctrno = :queryValue')
    } elseif ($kind === self::KIND_BL_NO) {
        $queryBuilder->where('c.blno = :queryValue')
    }

    $queryBuilder->setParameter('queryValue', $value);

    $query = $queryBuilder->getQuery();

    try {
        return $query->getResult();
    } catch(\Doctrine\ORM\NoResultException $e) {
        return null;
    }
}

我是否需要将:queryValue的参数设置为$value?