具有多对一关联的实体上的 getArrayResult

Posted

技术标签:

【中文标题】具有多对一关联的实体上的 getArrayResult【英文标题】:getArrayResult on entity with ManyToOne association 【发布时间】:2011-03-30 11:50:13 【问题描述】:

具有以下基本表(一对多关系) 客户端 - 有很多用户。 用户 - 每个用户都属于单个客户端。

在一个非常简单的示例中,如果我查询用户实体 (Querybuilder) 与getArrayResult() 我看到以下内容:

    实际生成的SQL中包含外键字段 返回(即 ClientID) 实际返回的数据数组不包含外键 场地。

现阶段我不需要返回国外数据,所以不需要 加入关联的表。

所以问题是...... 在我的数组中返回什么或如何返回外键值?

查询是:

   $qb = $this->_em->createQueryBuilder();  
   $qb->select('e');  
   $qb->from('Entity\User', 'e');  

SQL 是:

SELECT w0_.Id AS Id0, w0_.Name AS Name2, w0_.ClientID AS ClientID7
FROM users w0_  

【问题讨论】:

【参考方案1】:

在执行之前尝试在查询(而不是构建器)上设置HINT_INCLUDE_META_COLUMNS 查询提示。

$q->setHint(Query::HINT_INCLUDE_META_COLUMNS, true);

【讨论】:

如果我尝试只抓取 select 语句中的外键字段(而不是整个实体),这会不起作用吗?它似乎不适合我。 太好了,这个是救命稻草! 谢谢,现在我向前迈进了一步,但我需要将关系作为数组而不仅仅是 id... 以便能够使用 json 处理它,一个请求而不是每个 id 的 10 个请求 这很有趣,但效果不如预期。获取外键对我来说似乎很正常,但由于某种原因,关联的列名以 snake_case 形式返回,而其他属性以 CamelCase 形式返回。【参考方案2】:

据我所知,您不能这样做,因为 ClientID 不是用户的属性。用户有一个类似于 $client 的属性,并且该客户端实体有一个 $id。

这让您感到困惑,因为您正在处理实体,但您仍在使用 SQL 进行思考。

解决方案虽然效率稍低,但可能是将 Client 实体加入您的 DQL 查询,然后获取 $results[N]['client']['id'](或类似的,我对 getResultArray() 不太熟悉)

【讨论】:

这是我正在使用的解决方案,并且感谢我应该考虑“实体和 ORM”,而不是 SQL……但我们仍然希望生成高效的 SQL。我们真的不想不必要地加入另一个表。非常低效。不过感谢您的评论...

以上是关于具有多对一关联的实体上的 getArrayResult的主要内容,如果未能解决你的问题,请参考以下文章

我需要使用具有多对一关系的@Access=FIELD 注释吗?

Doctrine2 多对一关联不会使用 JOIN 查询

核心数据获取多对一关系对象

HQL 检索多对一关系中不同实体的列表

如何让jpa休眠创建具有多对一但没有外键的实体

CRUD easyadmin 多对一关系