15

我有一个 Doctrine 模型 ( Assignment),它与另一个模型 ( ) 具有多对一的关系Region。作业归用户所有(每个用户一次每个区域只有一个作业),我试图让indexBy用户的作业数组由作业区域的 ID 键入。但是,我只得到标准的 0..n 数字键。

当我尝试运行 DQL 查询SELECT am, reg, user FROM Assignment am INDEX BY [...] JOIN am.region reg JOIN am.user user WHERE user.id = ?1时,INDEX BY 的这些值都不起作用:

  • region(错误:无效的 PathExpression。必须是 StateFieldPathExpression。)
  • region_id(错误:类 ...\Assignment 没有名为 region_id 的字段或关联)
  • region.id(错误:预期的字符串结尾,得到 '.')

这可能吗?如果没有,那么User在没有 的区域上访问 的分配的便捷方法是indexBy什么?

4

3 回答 3

2

我今天正在处理同样的问题。幸运的是我找到了解决方案:)

首先,您必须在 ORM 映射中声明附加列:

Abdulklarapl\My\EntityA:
type: entity
table: entityA
manyToOne:
    entityB:
        targetEntity: EntityB
        joinColumn:
            name: label_id
            referencedColumnName: id
id:
    id:
        type: integer
        id: true
        generator:
            strategy: AUTO
fields:
    value:
        type: text
    entityB_id:
        type: integer
lifecycleCallbacks: {  }

请注意,我已声明entityB_id字段+ 我已通过添加子句配置了 manyToOne关系joinColumn

所以现在你可以使用 entityB_id 作为标量值

$doctrine->getEntityManager()->createQueryBuilder()
        ->select('c')
        ->from('AbdulklaraplMyBundle:EntityA', 'c', 'c.entityB_id')
        ->getQuery()->getResult();

它将返回关联数组

[
    c.entityB_id: {
        id: "",
        value: ""
        entityB_id: ""
    }
]

您也可以将AbstractQuery::HYDRATE_ARRAY其用作参数getResult()- 它将返回带有数组而不是对象的关联数组

于 2014-04-23T12:09:16.713 回答
1

如果您需要通过外键进行索引,例如“region_id”,则可以在您的映射中:

/**
 * @ORM\OneToMany(targetEntity="Region", mappedBy="user", indexBy="region_id")
 */
protected $regions;

该功能是在此处添加的

不幸的是,似乎没有记录您必须使用外键本身的列名。

使用索引关联

于 2016-09-08T08:27:30.403 回答
-2

导入查询类(可选):

use \Doctrine\ORM\Query;

创建查询:

$query = $this->data->em->createQuery('
    SELECT a 
    FROM Assignment a 
    INDEX BY a.reg //to set array custom key
    WHERE a.user = :user');
$query->setParameter('user', 3); //user with id 3

//set the hidration mode in order to work with read-only arrays
$assignments = $query->getResult(Query::HYDRATE_ARRAY); 
于 2012-09-06T04:49:55.357 回答