我的Symfony2应用有一个Person
实体,它有$firstName
和$lastName
作为其属性。它有一个方法getFullName()
,它返回Person
的全名。
// Vendor/Bundle/Entity/Person.php
public function getFullName()
{
return $this->firstName . ' ' . $this->lastName;
}
现在,我想允许用户搜索Person
。只有一个搜索字段,用户可以输入一些值。该值可以是他们查找的人的全名,名字或姓氏。
以下是来自控制器的一些代码,它们将进行过滤:
// Vendor/Bundle/Controller/PersonController.php
public function listAction(Request $request)
{
// ...
$people = $this->get('doctrine')
->getRepository('SomeBundle:Person')
->createQueryBuilder('p')
->where('p.fullName = :fullName')
->setParameter('fullName', $request->query->get('fullName'))
->getQuery()
->getResult();
// ...
}
然而,它不起作用。显然,这是因为fullName
不是Person
字段中的一个。
有没有办法使用QueryBuilder过滤结果,即我不想迭代所有结果并比较它们的名称?
尽管Victor's answer显示了正确的结果,但我仍然在寻找一种更“优雅”的方式来做到这一点。如果您有建议,请将您的建议发布为答案!
答案 0 :(得分:1)
如何用空格爆炸fullName
:
// Vendor/Bundle/Controller/PersonController.php
public function listAction(Request $request)
{
// ...
$name = explode(' ', $request->query->get('fullName'));
$people = $this->get('doctrine')
->getRepository('SomeBundle:Person')
->createQueryBuilder('p')
->where('p.firstname = :firstName')
->andWhere('p.lastName = :lastName')
->setParameter('firstName', $name[0])
->setParameter('lastName', $name[1])
->getQuery()
->getResult();
// ...
}
或尝试在查询中连接firstName
和lastName
字段:
// Vendor/Bundle/Controller/PersonController.php
public function listAction(Request $request)
{
// ...
$people = $this->get('doctrine')
->getRepository('SomeBundle:Person')
->createQueryBuilder('p')
->where('CONCAT(p.firstName, ' ', p.lastName) = :fullName')
->setParameter('fullName', $request->query->get('fullName'))
->getQuery()
->getResult();
// ...
}
注意:强>
如果您更改getFullName()
行为