【问题标题】:Fetch data from 3 fields in Symfony using DQL使用 DQL 从 Symfony 中的 3 个字段中获取数据
【发布时间】:2021-06-24 11:11:37
【问题描述】:

我有以下文件:

  • pid
  • 名字
  • emp_id

这是我的控制器:

    $data = $request->request->get('search');
    $result = $this->getDoctrine()->getRepository(MemberRecords::class)->getMember($data);

树枝形态:

 <form action="/admin/search", method="POST">
  <div class="form-row">
    <div class="form-group col">
      <input class="form-control rounded-0" placeholder="emp id, pin or firstname to search record" name="search">   
    </div>
    <div class="form-group col">
      <button class="btn btn-success rounded-0">Search</button>
    </div>
  </div>
</form>

存储库:

    public function getMember($data){
    return $this->createQueryBuilder('c')
                ->where('c.pid = :value or c.firstname LIKE :value or c.emp_id= :value')
                // ->orWhere('c.firstname LIKE :value')
                // ->orWhere('c.emp_id= :value')
                ->setParameter('value', $data)
                ->orderBy('c.id','ASC')
                ->getQuery()
                ->getResult()
                ;
}

让我在这里写下我想要实现的目标:

在搜索输入中,用户可以使用三个属性搜索成员详细信息; emp_id 或名字 orpid 任一属性必须在 MySql 表中匹配并获取数据。

从上面的存储库:

如果我在搜索栏中输入 pid 或 emp_id,返回的结果是完美的,但如果我输入名字,所有记录都会被提取。

where('c.pid = :value or c.firstname LIKE :value or c.emp_id = :value')

现在如果我删除 c.emp_id= :value 则返回所有匹配的名字,

where('c.pid = :value or c.firstname LIKE :value')

但如果我再次将c.emp_id= :value 放回 pid 和 emp_id 将准确提取,但是当我输入名字 firstname 时,即使我在搜索栏中输入随机单词,也会再次提取所有记录。

如何根据搜索栏输入获取记录的会员详细信息?

如果我在某个地方缺乏逻辑,请纠正我..

【问题讨论】:

    标签: symfony symfony-forms dql symfony5


    【解决方案1】:

    默认情况下,Doctrine 不允许部分对象。这意味着,任何只选择部分对象数据并希望将结果作为对象检索的查询(即 Query#getResult())都会引发异常,告诉您部分对象是危险的。如果您想强制查询返回部分对象,可能作为性能调整,您可以使用 partial 关键字,如下所示:

    <?php
    $q = $em->createQuery("select partial u.{id,name} from MyApp\Domain\User u");
    

    见:https://www.doctrine-project.org/projects/doctrine-orm/en/2.9/reference/partial-objects.html

    【讨论】:

      【解决方案2】:

      所以我终于找到了解决方案:

      以下代码完成了这项工作:

       ->andWhere('c.pid LIKE :value OR c.firstname LIKE :value OR c.emp_id LIKE :value')
      

      【讨论】:

        猜你喜欢
        • 2013-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 2020-08-04
        • 1970-01-01
        相关资源
        最近更新 更多