无法使用 getter 方法访问通过 querybuilder 选择的 Doctrine 2 特定字段
Doctrine 2 specific fields selected via querybuilder is not accessible using getter method
当我如下使用 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->getName() doesn't work but I have to use $result[0]->getName().
错误提示:
Fatal error: Call to a member function getName() on a non-object
如何在 queryBuilder 的 select 方法中选择特定字段,以便必须使用 getter 方法访问主数组值。为什么它不起作用。我的 select 查询有什么问题吗?
如果无法使用 getter 方法访问特定的 selected 字段有什么好处。我相信我做错了什么,但它并没有引起我的注意。
Note: While using $result, I removed array_hydrate, that is I'm passing object and hence expecting getter methods to work properly.
您遇到的问题是由向 SELECT 子句添加额外字段引起的。这导致结果将对象放在索引 0 处,以便能够将实体中没有的其他字段(例如 fullName
)添加到结果集中。
据我了解,您想要的只是有一种方法来获取每个用户的全名。与其在查询级别解决该问题,不如向 User
实体添加一个方法:
public function getFullName() {
return sprintf('%s %s', $this->getFirstName(), $this->getLastName());
}
然后 select 用户以通常的方式:
SELECT u FROM User u
您现在可以通过以下方式获取第一个用户的全名:
$result[0]->getFullName();
这里不需要部分对象。部分对象具有完全不同的用例。
当我如下使用 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->getName() doesn't work but I have to use $result[0]->getName().
错误提示:
Fatal error: Call to a member function getName() on a non-object
如何在 queryBuilder 的 select 方法中选择特定字段,以便必须使用 getter 方法访问主数组值。为什么它不起作用。我的 select 查询有什么问题吗?
如果无法使用 getter 方法访问特定的 selected 字段有什么好处。我相信我做错了什么,但它并没有引起我的注意。
Note: While using $result, I removed array_hydrate, that is I'm passing object and hence expecting getter methods to work properly.
您遇到的问题是由向 SELECT 子句添加额外字段引起的。这导致结果将对象放在索引 0 处,以便能够将实体中没有的其他字段(例如 fullName
)添加到结果集中。
据我了解,您想要的只是有一种方法来获取每个用户的全名。与其在查询级别解决该问题,不如向 User
实体添加一个方法:
public function getFullName() {
return sprintf('%s %s', $this->getFirstName(), $this->getLastName());
}
然后 select 用户以通常的方式:
SELECT u FROM User u
您现在可以通过以下方式获取第一个用户的全名:
$result[0]->getFullName();
这里不需要部分对象。部分对象具有完全不同的用例。