Symfony / Doctrine:addJoinedEntityResult如何为一对多关系工作?

时间:2012-07-06 22:24:13

标签: symfony doctrine native

我有以下问题。我想这是误会。但谷歌搜索了几个小时后没有找到解决方案我在这里发布。

我在Doctrine中有一个原生查询:

$rsm = new ResultSetMapping;
        $rsm->addEntityResult('Acme\CommentBundle\Entity\Comment', 'c');
        $rsm->addFieldResult('c', 'comment_id', 'id');
        $rsm->addFieldResult('c', 'slug', 'slug');
        $rsm->addFieldResult('c', 'comment', 'comment');
        $rsm->addFieldResult('c', 'created', 'created');
        $rsm->addJoinedEntityResult('Acme\AccountBundle\Entity\Worker', 'w', 'c', 'komments');
        $rsm->addFieldResult('w', 'worker_id', 'id');
        $rsm->addFieldResult('w', 'worker_name', 'name');
        $rsm->addJoinedEntityResult('Acme\CommentBundle\Entity\Document', 'd', 'c', 'documents');
        $rsm->addFieldResult('d', 'document_id', 'id');
        $rsm->addFieldResult('d', 'document_name', 'name');

        return $this->getEntityManager()
            ->createNativeQuery('SELECT t.id, c.id AS comment_id, c.slug, c.created, c.comment, c.worker_id AS comment_worker_id, c.created AS comment_created, d.id AS document_id, d.name AS document_name, w.id AS worker_id, w.name AS worker_name
            FROM comment_thread t
            INNER JOIN project p ON p.comment_thread_id = t.id
            LEFT JOIN comment c ON t.id = c.thread_id
            INNER JOIN worker w ON c.worker_id = w.id
            LEFT JOIN comment_document d ON c.id = d.comment_id
            WHERE p.id = :project_id
            ORDER BY c.created ASC', $rsm)
            ->setParameter('project_id', $

不幸的是,第一个addJoinedEntityResult(Worker)无效。如果我删除它,剩下的addJoinedEntityResult(Document)就是完美的。

我想这是因为文档与评论相关联。所以评论是文件的“父母”。 如果是工人,反之亦然:评论是工人的“孩子”,而不是文件的“父母”。

换句话说: - 工人可以有多个评论 - 评论可以有多个文件

我的结果集应该以Comment为基础,并且(一个)worker和(0..n)文档相关联。

但是如何在我的Doctrine Result Mapping中设置这种关系?

感谢任何帮助: - )

尼基

2 个答案:

答案 0 :(得分:0)

我的建议是当你附加第二个实体时mapper会重写“name”字段。具有相同的情况并通过重命名表中的字段以及实体映射和实体类来修复它,因此不同的实体/表没有相同的名称属性/列。

答案 1 :(得分:-2)

我看不到你的实体,所以我不确定这是否有任何帮助,但看起来你有一个错字:

$rsm->addJoinedEntityResult('Acme\AccountBundle\Entity\Worker', 'w', 'c', 'komments');

也许应该是

$rsm->addJoinedEntityResult('Acme\AccountBundle\Entity\Worker', 'w', 'c', 'comments');

komments to comments