Doctrine orm 原则,如何将关系的所有对象添加到QueryBuilder的结果中,并实际显示添加对象的内容?

Doctrine orm 原则,如何将关系的所有对象添加到QueryBuilder的结果中,并实际显示添加对象的内容?,doctrine-orm,doctrine,symfony4,Doctrine Orm,Doctrine,Symfony4,我的数据库中有以下结构: 每间房子都有多间卧室和多个厨房。每个厨房都有多个橱柜 现在,我根据给定的卧室获得所有橱柜(我知道这很奇怪)。所以我进入一间卧室,它会向上看房子,得到所有与房子相关的厨房,然后是所有厨房的橱柜。这是它的代码: 公共功能FindCabinestBy卧房(卧房$卧房) { 返回$this->createQueryBuilder('cabinet')) ->加入(‘橱柜、厨房’、‘厨房’) ->加入(‘厨房、房子’、‘房子’) ->加入(‘房子、卧室’、‘卧室’) ->选择(

我的数据库中有以下结构:

每间房子都有多间卧室和多个厨房。每个厨房都有多个橱柜

现在,我根据给定的卧室获得所有橱柜(我知道这很奇怪)。所以我进入一间卧室,它会向上看房子,得到所有与房子相关的厨房,然后是所有厨房的橱柜。这是它的代码:

公共功能FindCabinestBy卧房(卧房$卧房)
{
返回$this->createQueryBuilder('cabinet'))
->加入(‘橱柜、厨房’、‘厨房’)
->加入(‘厨房、房子’、‘房子’)
->加入(‘房子、卧室’、‘卧室’)
->选择('文件柜')
->andWhere('卧室=:卧室')
->setParameter('卧房',$卧房)
->getQuery()
->getResult(查询::对象);
}
我想扩展我的代码以包含每个橱柜的厨房甚至房子。我只需在代码中添加
->addSelect('Kitchen')
就可以得到厨房。因此:

公共功能FindCabinets和RkitchenByBedroom(卧室$卧室)
{
返回$this->createQueryBuilder('cabinet'))
->加入(‘橱柜、厨房’、‘厨房’)
->加入(‘厨房、房子’、‘房子’)
->加入(‘房子、卧室’、‘卧室’)
->选择('文件柜')
->addSelect('厨房')
->andWhere('卧室=:卧室')
->setParameter('卧房',$卧房)
->getQuery()
->getResult(查询::对象);
}
但是,试图添加厨房的房屋信息并不能以同样的方式工作,我想这与橱柜与房屋没有直接关系这一事实有关。如果我使用最新的方法(aka
findcabinetsantheirkitchenbybedroom
),Xdebug将显示以下内容:

当我使用第一个(又称为FindCabinestByDoomy)时,我反对这一点:

因此,根据这些结果,我得出结论,
addSelect
确实返回了厨房。是的,我检查了数据库中的数据,结果是正确的。但我如何将房屋信息添加到内阁

还有一个问题,尽管Xdebug为每个橱柜显示了正确的厨房信息,但由于某些原因,在使用POSTMAN或浏览器进行测试时,这些信息并没有返回。我得到以下结果:

{ "id": 1, "time": { "date": "2019-06-12 11:51:22.000000", "timezone_type": 3, "timezone": "UTC" }, "productCategory": "someCat", "kitchen": {} }

因为某种原因它是空的。你知道如何在对象厨房中显示信息吗?我认为这与它是一个不同于Cabinet的对象有关,但是按照这个逻辑,
time
的内容也应该是空的,因为它是一个
DateTime
对象。所以这不可能,但我不知道为什么它会被退回空的

当使用条令时,与其他实体对象的关联默认加载为“惰性”,请参阅以下文档:

在原则2.1中,为关联引入了一个称为额外延迟的特性关联在默认情况下标记为惰性,这意味着关联的整个集合对象在第一次访问时填充。[…]

(我要说的是,关于默认抓取设置的文档非常缺乏,因为这是我唯一能找到的地方(升级文档),我可以在这里找到它)


这意味着:如果您有类似于以下注释的内容,则意味着在调用关系之前不会包括这些关系,例如,通过
getObject()
getCollection()

在这种情况下,当您获取
House
对象时,在执行过程中(即使用Xdebug)对该对象的检查将显示
$House
确实有
$bathrooms
,但是,每个实例将沿以下行显示:

{
    id: 123,
    location: null,
    house: 2,
    faucets: null,
    shower: null,
    __initialized__:false
}
此对象的存在表明,条令意识到浴室与房屋相关(因此双向关系上设置了前后ID,但未设置其他属性),但是,
\uuuuuu initialized\uuuuuuuuuuu:false
表明条令未获取该对象。因此:
fetch=“LAZY”


要获取与
get*()
操作的关联,必须将它们设置为
fetch=“EAGER”
,如图所示

无论何时查询具有持久关联的实体,并且这些关联映射为“渴望”,它们都将自动与所查询的实体一起加载,因此可立即用于应用程序


要解决您的问题,请执行以下操作:

将您希望立即返回的关联标记为
fetch=“EAGER”


额外:


请查看,特别是,和。这些引用还显示了每个关联类型可用的
fetch
选项。

您是否尝试将select
kitchen.house
添加为新的
addSelect
?因为这不适用于关系的注释(例如,
@ORM\OneToMany(..)
),所以添加
fetch=“EAGER”
作为选项。请看这里:(并在该页面中搜索“fetch”以获取更多示例)。额外信息:,@rkeet这帮我解决了!你能补充你的评论作为回答吗?这样我就可以接受了?
{ "id": 1, "time": { "date": "2019-06-12 11:51:22.000000", "timezone_type": 3, "timezone": "UTC" }, "productCategory": "someCat", "kitchen": {} }
/**
 * @var Collection|Bathroom[]
 * @ORM\OneToMany(targetEntity="Entity\Bathroom", mappedBy="house")
 */
private $bathrooms;
{
    id: 123,
    location: null,
    house: 2,
    faucets: null,
    shower: null,
    __initialized__:false
}