Symfony2中的搜索功能无效

时间:2015-07-27 03:25:23

标签: php symfony doctrine

我正在使用symfony框架开发一个项目。我只想制作一个简单的搜索功能,它可以搜索包含用户输入内容的所有实体。当我尝试运行我的代码时,它无法正常工作,即使它们是一个可以找到的相关文件,它也会继续重定向到我找不到的结果。

这是我的控制器:

public function searchAction(Request $request){
        $request = $this->getRequest();
        $data = $request->request->get('search');


        $em = $this->getDoctrine()->getManager();
        $query = $em->createQuery(
                'SELECT a,b,c
                FROM SampleBundle:transactionDetail a
                JOIN a.transaction b
                JOIN b.documentRelated c
                WHERE a.pNumber LIKE :data
                AND b.senderId LIKE :data
                AND b.receiverId LIKE :data
                AND b.transactDate LIKE :data
                AND a.amountPaid LIKE :data')
                ->setParameter('data',$data);  

        $res = $query->getResult();
        if($res == null){
                return $this->render('SampleBundle:Sample:noresult.html.twig');
        }
        return $this->render('SampleBundle:Sample:search.html.twig', array('res' => $res));
    }

和我的search.html.twig

{% extends '::layout.html.twig' %}
{% block pageTitle %} Related Files Found{% endblock %}
{% block body %}

div class="table-responsive margins" >
  <table  class="table table-condensed table-striped table-bordered table-hover no-margin">
      <thead>
        <tr style="height: 40px; ">
        <th>Transaction Date</th>       
        <th>Sender ID</th> 
        <th>Receiver ID</th>
        <th>P Number</th> 
        <th>Amount Paid</th> 

      </tr>
    </thead>
    <tbody>
    <tr>    
        {% for res in res %}         
          {% for other in res.transaction %}
         <td >{{res.transaction.transactDate|date('YMd')}}&nbsp;&nbsp;{{res.ediTransaction.transactionDate|date('H:i')}}</td>
          <td>{{res.transaction.senderId}}</td>
          <td >{{res.transaction.receiverId}}</td>

          {% if other.pNumber != null %}
            <td style="word-break: break-all">{{other.pNumber}}</td> 
          {% else %}
            <td>N/A</td>
          {% endif %}
          {% if other.amountPaid != null %}
             <td style="word-break: break-all">{{other.amountPaid}}</td>    
          {% else %}
            <td>N/A</td>
          {% endif %}

      </tr>
          {% endfor %}
      {% endfor %}
      </tbody>
    </table>
  </div>
{% endblock %}
{% block javascripts %}
  {% javascripts
    'bundles/sampledoc/js/jQuery.js'
    'bundles/sampledoc/js/bootstrap.js'
     %}
    <script src="{{ asset_url }}"></script>

  {% endjavascripts %}
{% endblock %}

我的搜索表单:

<form action="{{path('sample_search')}}" method="POST">
  <div class="form-group input-group">
    <input type="text" name="search" class="form-control" placeholder="Search" style="width: 200px; float: right;" >
      <span class="input-group-btn"><button class="btn btn-default" type="submit" style="margin-right: 20px;"><i class="fa fa-search"></i></button></span>
  </div>
</form>

有人可以帮我这个吗?提前谢谢。

2 个答案:

答案 0 :(得分:1)

数据不能等于您的所有条件。如果您和查询数据中的所有内容必须匹配所有字段,那么您可能不会返回任何结果。

尝试类似:

WHERE a.pNumber LIKE :data
OR b.senderId LIKE :data
OR b.receiverId LIKE :data
OR b.transactDate LIKE :data
OR a.amountPaid LIKE :data')
->setParameter('data', "%$data%"); 

使用

查看生成的SQL
$query->getSQL()

这样您就可以直接在数据库上测试您的查询。

答案 1 :(得分:0)

假设$ data是一个包含所有好东西的关联数组,我认为你不能像你一样把它交给setParameter()。你需要更具体地分解它,对于每一个&#34; LIKE&#34;条款。

完全未经测试但我怀疑你正在寻找类似的东西:

`
WHERE a.pNumber LIKE :pNumber
AND b.senderId LIKE :senderId
AND b.receiverId LIKE :recieveId
AND b.transactDate LIKE :transactDate
AND a.amountPaid LIKE :amountPaid')
->setParameters(array(
    'pNumber' => $data['pNumber'],
    'receiverId'   => $data['receiverId'],
    'transactDate' => $data['transactDate'],
    'amountPaid'   => $data['amountPaid'],
));
`