【问题标题】:Symfony2 / Doctrine - How to append an extra field to fetched objectsSymfony2 / Doctrine - 如何将额外字段附加到获取的对象
【发布时间】:2013-05-25 19:18:51
【问题描述】:

现状

有四种型号:

制作人

  • 身份证
  • 姓名
  • 说明
  • 产品(OneToMany -> 产品)

产品实现 DoctrineExtensions\Taggable\Taggable

  • 身份证
  • 姓名
  • 生产者(ManyToOne -> 生产者)
  • 标签

标记和标记

由 DoctrineExtensions\Taggable\Taggable 生成

目标

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

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

我希望能够打字 {% for tag 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 实体,我如何将该字段映射到对象?
  • 如何将标签映射为实体

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

【问题讨论】:

    标签: php symfony doctrine-orm mapping dql


    【解决方案1】:

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

    【讨论】:

    • 您能否详细说明如何实现这一目标?
    • 答案中的链接已失效,评论中的链接指向 Doctrine1 而问题是关于 Doctrine2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2015-06-16
    • 2011-05-25
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    相关资源
    最近更新 更多