Symfony2 / Doctrine - 如何将附加字段附加到获取的对象

时间:2013-05-30 09:23:52

标签: php symfony doctrine-orm mapping dql

现状

有四种型号:

生产者

  • ID
  • 名称
  • 描述
  • 产品(OneToMany - >产品)

产品实现DoctrineExtensions \ Taggable \ Taggable

  • ID
  • 名称
  • 制作人(ManyToOne - >制片人)
  • 标签

标签&标记

由DoctrineExtensions \ Taggable \ Taggable生成

目标

在Producer存储库中,我想获得与其产品相关联的标签的生产者列表:

array(
    array( // Producer
        'id' => 1, 
        'name' => 'Producer A', 
        'description' => '...', 
        'tags' => array(
            array( // Tag
                'id' => 1,
                'name' => 'Tag A'
            ),
            array(...)
        )
    ),
    array(...)
)

我希望能够打字     {%for producer in producer.tags%}         {{ 标签名称 }}     {%endfor%}

问题

我可以进行如下的SQL查询(这是一个临时解决方案):

    $rsm = new ResultSetMapping;
    $rsm->addScalarResult('id', 'id');
    $rsm->addScalarResult('name', 'name');
    $rsm->addScalarResult('slug', 'slug');
    $rsm->addScalarResult('tags', 'tags');

    $sql = 'SELECT p.id as id, p.name as name, p.slug as slug, GROUP_CONCAT(DISTINCT t.`name` ORDER BY t.`name` ASC SEPARATOR "||") as tags
        FROM `es_producer` as p
        LEFT JOIN `es_product` as pr ON pr.`producer_id` = p.id
        LEFT JOIN `es_tagging` as tt ON tt.`resource_id` = pr.id
        LEFT JOIN es_tag as t ON t.id = tt.`tag_id`
        WHERE ISNULL(p.`deleted_at`)
        GROUP BY p.id';

    $query = $this->getEntityManager()->createNativeQuery($sql, $rsm);

    return $query->getArrayResult();

获取一个生产者字段数组,其中包含一个额外的'tags'字段作为一个带有字符串的字符串。

问题

  • 由于我想将字段映射到相应的对象而标记字段不属于 Producer 实体,如何将该字段映射到对象?
  • 如何将标记映射为实体

目前,我将所有字段映射为标量结果。这意味着我只得到一个没有我的对象的所有设施的数组。

1 个答案:

答案 0 :(得分:0)

您可以使用自定义Hydrator来完成此操作。