使用getter方法无法访问通过querybuilder选择的Doctrine 2特定字段

时间:2015-12-25 16:52:42

标签: doctrine-orm zend-framework2

当我使用doctrine 2查询构建器创建结果集时:

$queryBuilder = $this->orm->createQueryBuilder();
$queryBuilder->select("s.id","partial s.{id, name, user}","s.name","concat(u.firstname,' ',u.lastname) fullName")
->add('from', 'Application\Entity\Schools s')
->leftJoin('s.user', 'u', 'WITH', 'u.id = s.user')
->getQuery()->getResult(Query::HYDRATE_ARRAY);
echo "<pre>";
print_r($dd);
die;

它提供以下数据:

Array
(
[0] => Array
    (
        [0] => Array
            (
                [id] => 1
                [name] => DAV Public School
            )

        [id] => 1
        [name] => DAV Public School
        [fullName] => Manu Sharma
    )

[1] => Array
    (
        [0] => Array
            (
                [id] => 2
                [name] => Delhi Public School
            )

        [id] => 2
        [name] => Delhi Public School
        [fullName] => Vipul Sharma
    )
)

所以当我尝试使用getter方法获取其值时:

  

$ result-&gt; getName()不起作用,但我必须使用$ result [0] - &gt; getName()。

并且错误说:

  

致命错误:在非对象

上调用成员函数getName()

如何在queryBuilder的select方法中选择特定字段,以便必须使用getter方法访问主数组值。为什么它不起作用。我的选择查询有什么问题。

如果使用getter方法无法访问特定的选定字段,有什么好处。我相信我做错了什么但它并没有引起我的注意。

  

注意:在使用$ result时,我删除了array_hydrate,这就是我传递对象,因此期望getter方法正常工作。

1 个答案:

答案 0 :(得分:2)

您遇到的问题是由于在SELECT子句中添加了其他字段。这导致结果将对象放在索引0处,以便能够将实体中没有的fullName等其他字段添加到结果集中。

据我了解,您只需要一种方法来获取每个用户的全名。您最好只在User实体添加方法,而不是在查询级别解决该问题:

public function getFullName() {
    return sprintf('%s %s', $this->getFirstName(), $this->getLastName());
}

然后只需按常规方式选择用户:

SELECT u FROM User u

您现在可以通过以下方式获取第一个用户的全名:

$result[0]->getFullName();

这里你不需要部分对象。部分对象具有完全不同的用例。