2014-02-27 13 views
1

我的Symfony2应用程序有一个Person实体,它具有$firstName$lastName作为其属性。它有一个方法getFullName()它返回全名Person在DQL中使用实体的方法(Symfony2)

// 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

那么,它是b因为fullName不是Person的字段。您可以存储它,也可以过滤firstName或/和lastName(在where子句中)。 – Brice

+0

@Brice但是,如果用户输入一个人的全名,它将不起作用。 – pikachu0

+0

为什么不呢?只需'爆炸()'fullName并将每个部分与'firstName'和'lastName'进行比较。 – Brice

回答

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(); 
    // ... 
} 

或试图串联firstNamelastName字段查询:

// 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()它可能是不准确行为

+1

不,那么一个叫“嘿,我的名字是”*的人呢? – Touki

+0

保存到数据库之前检查正确的名称! :) –

+1

如果'name = lastName + firstName'会怎么样? – Brice