我有以下实体:Event :hasOne: User :hasHone: Group
我想渲染一个数组(比如getArrayResult()
方法,但是使用链接的实体,所以我在这里做了:
// build query
$em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
$query = $em->createQueryBuilder()
->select('evt, usr')
->from('Application\Model\Event', 'evt')
->join('Application\Model\User', 'usr')
->where('evt.userId in (:uid)')
->setParameter('uid', $usersId);
if (null !== $from) {
$query->andWhere('TRUNC(evt.litteralDate) > TO_DATE(:from, \'yyyy-mm-dd\')')
->setParameter('from', $from);
}
if (null !== $to) {
$query->andWhere('TRUNC(evt.litteralDate) < TO_DATE(:to, \'yyyy-mm-dd\')')
->setParameter('to', $to);
}
$events = $query->getQuery()->getArrayResult();
问题是getArrayResult()
使我所选择的所有数据变得平坦,所以我在同一级别上拥有用户和事件,我该如何实现这样的目标:
{
"events": [
{
"id": 1677,
"userId": 2,
"type": "T",
"date": {
"date": "2013-03-05 00:00:00",
"timezone_type": 3,
"timezone": "Europe/Paris"
},
"litteralDate": "05-MAR-13",
"piquet": true,
"when": "passe",
"description": "Jour Travaille",
"user" : {
"id" : 2,
"login" : "myUserName",
"name" : "MY user name"
}
},
}
答案 0 :(得分:1)
如果你想在另一个实体中fetch-join
一个实体,你需要在select子句中询问主实体和你想要加入的实体。 Read here on how to fetch-join in dql
现在你在Application\Model\User
子句中引用join
的实体类,你应该引用事件实体和用户实体之间的关联。
因此,假设您在事件实体Application\Model\Event
的存储库中(使用简短符号evt
)并且您想要加入与之关联的实体Application\Model\User
属性user
中的事件实体。然后你需要编写如下的join子句:
$query = $this->createQueryBuilder('evt')
->select('evt', 'usr')
->leftJoin('evt.user', 'usr')
...other parts of the query
->getQuery();
$array = $query->getResult(Query::HYDRATE_ARRAY)
由于您位于Application\Model\Event
实体的存储库中,因此您根本不需要FROM
子句(可以跳过),因为默认情况下创建的QueryBuilder
默认情况下会将该实体用于$this
存储库。
另一个提示:
我认为要提取结果,您应该参考DoctrineObject
hydrator。
您可以按值和引用提取对象。您可以阅读如何执行此操作here。