序列化doctrine2实体

时间:2014-10-14 09:00:28

标签: php serialization doctrine-orm zend-framework2 query-builder

我有以下实体: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"
            }
        },
}

1 个答案:

答案 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