学说:INDEX BY相关领域是否可能?

时间:2012-09-04 17:59:26

标签: doctrine-orm dql many-to-one

我有一个Doctrine模型(Assignment),它与另一个模型(Region)有多对一的关系。分配由用户拥有(每个用户一次只能为每个区域分配一个分配),并且我尝试使用indexBy来使用户的分配数组由分配区域的ID键控。但是,我只获得标准的0..n数字键。

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

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

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

3 个答案:

答案 0 :(得分:1)

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

首先,您必须在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声明为字段 +我已通过添加joinColumn子句 manyToOne 关系>

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

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

它将返回assoc数组

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

您也可以使用AbstractQuery::HYDRATE_ARRAY作为getResult()的参数 - 它将返回带数组的assoc数组而不是对象

答案 1 :(得分:1)

如果您需要INDEX BY外键,例如“region_id”可以在您的映射中使用:

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

该功能为added here

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

Working with Indexed Associations

答案 2 :(得分:-3)

导入Query类(可选):

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);