在DQL中使用实体的方法(Symfony2)

时间:2014-02-27 10:51:33

标签: php symfony

我的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显示了正确的结果,但我仍然在寻找一种更“优雅”的方式来做到这一点。如果您有建议,请将您的建议发布为答案!

1 个答案:

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

或尝试在查询中连接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()行为

,则可能不准确