我有一个条令模型(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
(错误:应为字符串结尾,实际为'.')
这可能吗?如果不是,那么在没有indexBy
的区域上访问User
的分配有什么方便的方法呢?
我今天也在处理同样的问题。幸运的是,我找到了解决方案:)
首先,您必须在ORM映射中声明额外的列:
AbdulklaraplMyEntityA:
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数组,而不是对象
如果您需要通过外键索引,例如"region_id",则可以在映射中使用:
/**
* @ORMOneToMany(targetEntity="Region", mappedBy="user", indexBy="region_id")
*/
protected $regions;
此功能已添加到此处。
不幸的是,似乎没有记录您必须使用外键本身的列的名称。
使用索引关联
导入查询类(可选):
use DoctrineORMQuery;
创建查询:
$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);