2

现在的情况

有四种型号:

制片人

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

产品实现 DoctrineExtensions\Taggable\Taggable

  • ID
  • 姓名
  • 生产者(多对一 -> 生产者)
  • 标签

标记和标记

由 DoctrineExtensions\Taggable\Taggable 生成

目标

在生产者存储库中,我想获取生产者列表以及与其产品关联的标签:

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

我希望能够在 producer.tags %} {{ tag.name }} {% endfor %} 中输入 {% for tag

问题

我可以进行如下 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实体,我如何将该字段映射到对象?
  • 如何将标签映射为实体

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

4

1 回答 1

0

您可以通过使用自定义Hydrator来做到这一点。

于 2013-05-30T09:32:39.333 回答