【问题标题】:serializing doctrine2 entities序列化教义2实体
【发布时间】:2014-10-14 09:00:27
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    如果您想fetch-join 一个实体内的另一个实体,您需要在选择子句中询问主要实体和要加入的实体。 Read here on how to fetch-join in dql.

    现在您在join 子句中引用Application\Model\User 的实体类,您应该改为引用事件实体和用户实体之间的关联。

    假设您在您的事件实体Application\Model\Event(您使用短符号evt)的存储库中,并且您想加入与属性@ 中的事件实体关联的实体Application\Model\User 987654330@。然后你需要像这样编写连接子句:

    $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 将默认使用该实体作为 @ 987654335@存储库。

    另一个提示:

    我认为要提取您的结果,您应该参考DoctrineObject hydrator。

    您可以通过值和引用来提取对象。你可以阅读如何做到这一点here。

    【讨论】:

    • 谢谢,我错过了 join 子句中的“引用”,而是使用实体的新副本
    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 2015-02-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多