Php 如何在控制器中正确执行symfony2中的If语句

Php 如何在控制器中正确执行symfony2中的If语句,php,mysql,symfony,Php,Mysql,Symfony,你能帮我正确地做这件事吗 下面是我的默认控制器 public function searchAction(){ $request = $this->getRequest(); $data = $request->request->get('search'); $data1 = $request->request->get('search1'); $data2 = $request->request->get('search2'); $em

你能帮我正确地做这件事吗

下面是我的默认控制器

public function searchAction(){     
$request = $this->getRequest();
$data = $request->request->get('search');
$data1 = $request->request->get('search1');
$data2 = $request->request->get('search2');


$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
 'SELECT p 
 FROM FooTransBundle:Trans p, FooTransBundle:Supplier d
 WHERE p.transType LIKE :data
 OR d.name LIKE :data1
 OR p.sendDate LIKE :data2')
->setParameter('data',$data)
->setParameter('data1', $data1)
->setParameter('data2',$data2);  

$res = $query->getResult();
return $this->render('FooTransBundle:Default:search.html.twig', array(
'res' => $res));
}
下面是我的树枝档案

<form class="form-horizontal"role="form"name ="search"method="post" action="{{path('foo_trans_search') }}">
 <div class="form-group">
  <label for="agr"class="col-sm-2 control-label">Trans Type</label>
    <div class="col-sm-10">
        <input type="text"class="form-control"id="agr"placeholder="Trans Type" name ="search">
    </div>
   </div>
   <div class="form-group">
      <label for="trad"class="col-sm-2 control-label">Name:</label>
       <div class="col-sm-10">
         <input type="text"class="form-control"id="trad"placeholder="Name" name ="search1">
       </div>
   </div>
  <div class="form-group">
     <label for="send"class="col-sm-2 control-label">Send Date:</label>
      <div class="col-sm-10">
       <input type="text"class="form-control"id="send"placeholder="YYYY-MM-DD"name ="search2">
     </div>
    </div>
   <div class="form-group">
       <div class="col-sm-offset-2 col-sm-10">
             <button type="submit"class="btn btn-primary">Submit</button>
            <a class="btn btn-primary"href="{{  path('foo_trans_show_all')}}"role="button"target="iframe_loader">Cancel</a>
         </div>
</div>
  </form>
        <table class="table table-condensed">
         <tr class="active ">
           <td>Supplier Name</td>
            <td>Trans Type</td>
            <td>Transaction Date</td>  
         </tr>
          <tr class="info">
            {% block content_header_more %}

                {% for new in res %}
                   <td><a href="{{ path('foo_trans_show', {'id':  new.transId  }) }}">{{ new.getSupplier.name }}</a>
                  <td>{{new.transactionType}}</td>
                  <td>{{new.sendDate}}</td>           
        </tr> 
          {% endfor %}
      {% endblock %}
 </table>
然后它将查询与该单词匹配的3个数据。如果全部为空,它将返回“无需搜索”的内容。而且,即使用户只将数据放在两个输入字段中,它仍能实现其目的。if的示例情况再次出现:

 if($data == null && $data1 != null && $data2 != null){
//query here that will search the two values that are not null
 }

请你能帮帮我吗。有什么想法吗??提前感谢。

您可以尝试以下内容: -创建;-创建通过某些筛选条件获取记录的方法;-从控制器操作调用存储库方法;下面是一个简单的例子:

控制器操作:

    public function testAction(Request $request)
    {
        $postParameters = $request->request->all();
        $data = [];
        $res = null;

        foreach ($postParameters as $key => $value) {
            if (!$value) {
                continue;
            }

            $data[$key] = $value;
        }

        if (!empty($data)) {
            $em = $this->getDoctrine()->getManager();
            $res = $em->getRepository('FooTransBundle:Trans')->fetchByCriteria($data);
        }

        return $this->render('FooTransBundle:Default:search.html.twig', [
            'res' => $res
        ]);
    }
存储库方法:

    public function fetchByCriteria(array $criteria)
    {
        $queryBuilder = $this->getEntityManager()->createQueryBuilder();
        $query = $queryBuilder
            ->select(['p'])
            ->from('FooTransBundle:Trans', 'p')
            ->innerJoin('p.supplier', 'd') // from you code it's not so clear how are you trying to select from tables, that's why i am joining them, just for example. 
        ;

        $parameters = [];
        foreach ($criteria as $key => $value) {
            if ($key == 'search') {
                $query->andWhere($queryBuilder->expr()->like('p.transType', ':data'));
                $parameters['data'] = '%' . $value . '%';
            }

            if ($key == 'search1') {
                $query->andWhere($queryBuilder->expr()->like('d.name', ':data1'));
                $parameters['data1'] = '%' . $value . '%';
            }

            if ($key == 'search2') {
                $query->andWhere($queryBuilder->expr()->like('p.sendDate', ':data2'));
                $parameters['data2'] = '%' . $value . '%';
            }
        }

        $query->setParameters($parameters);

        return $query->getQuery()->getResult();
    }
细枝:


非常感谢你。但我有一个问题,当我试图搜索的名称只。输出将显示数据库中的所有数据,即使它与我搜索的名称无关。顺便说一下,我对我的存储库做了如下更改
->innerJoin('FooTransBundle:Supplier','d')
。我真的非常感谢你的进一步帮助。
    public function fetchByCriteria(array $criteria)
    {
        $queryBuilder = $this->getEntityManager()->createQueryBuilder();
        $query = $queryBuilder
            ->select(['p'])
            ->from('FooTransBundle:Trans', 'p')
            ->innerJoin('p.supplier', 'd') // from you code it's not so clear how are you trying to select from tables, that's why i am joining them, just for example. 
        ;

        $parameters = [];
        foreach ($criteria as $key => $value) {
            if ($key == 'search') {
                $query->andWhere($queryBuilder->expr()->like('p.transType', ':data'));
                $parameters['data'] = '%' . $value . '%';
            }

            if ($key == 'search1') {
                $query->andWhere($queryBuilder->expr()->like('d.name', ':data1'));
                $parameters['data1'] = '%' . $value . '%';
            }

            if ($key == 'search2') {
                $query->andWhere($queryBuilder->expr()->like('p.sendDate', ':data2'));
                $parameters['data2'] = '%' . $value . '%';
            }
        }

        $query->setParameters($parameters);

        return $query->getQuery()->getResult();
    }
{% if res is not null %}
 -- CODE --
{% else %}
 No result!
{% endif %}