首页 > 解决方案 > 使用 DQL 从 Symfony 中的 3 个字段中获取数据

问题描述

我有以下文件:

这是我的控制器:

    $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 或 firstname 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 时,即使我在搜索栏中输入随机单词,也会再次提取所有记录。

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

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

标签: symfonysymfony-formsdqlsymfony5

解决方案


默认情况下,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


推荐阅读