【发布时间】:2019-06-20 19:09:49
【问题描述】:
我有一些在 Symfony 4 中相互关联的实体。
所以基本上一个房子可以有多个卧室和多个厨房。每个厨房可以有多个橱柜。我目前的设计是输入一个卧室 id,然后它将查找与该卧室 id 的房子相关联的所有厨房,然后返回与这些厨房相关联的所有橱柜。
这是查询构建器(效果很好):
public function findCabinetsByBedroomId(Bedroom $bedroom)
{
return $this->createQueryBuilder('cabinet')
->join('cabinet.kitchen', 'kitchen')
->join('kitchen.house', 'house')
->join('house.bedroom', 'bedroom')
->addSelect('cabinet')
->andWhere('bedroom = :bedroom')
->setParameter('bedroom', $bedroom)
->getQuery()
->getResult();
}
返回以下形状的列表:
[
{
"id": 1,
"time": {
"date": "2019-06-12 11:51:22.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"productCategory": "Big",
"kitchen": {
"__initializer__": null,
"__cloner__": null,
"__isInitialized__": true,
"house": {
"__initializer__": null,
"__cloner__": null,
"__isInitialized__": true,
"kitchen": {},
"bedroom": {},
"id": 555,
"name": "someName"
},
"id": 55,
"name": "kitchen1",
"country": "US"
}
},
{
"id": 8888,
"time": {
"date": "2019-06-12 09:51:22.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"productCategory": "small",
"kitchen": {
"__initializer__": null,
"__cloner__": null,
"__isInitialized__": true,
"house": {
"__initializer__": null,
"__cloner__": null,
"__isInitialized__": true,
"kitchen": {},
"bedroom": {},
"id": 555,
"name": "someName2"
},
"id": 2,
"name": "anotherName",
"country": "UK"
}
}
]
我了解 Docker 会自动为所有关联添加神奇的 getter。有没有办法禁用它?像这样返回橱柜信息:
[
{
"id": 1,
"time": {
"date": "2019-06-12 11:51:22.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"productCategory": "Big",
},
{
"id": 8888,
"time": {
"date": "2019-06-12 09:51:22.000000",
"timezone_type": 3,
"timezone": "UTC"
},
"productCategory": "small",
}
]
用户@alx 试图在his comment on my previous question 中向我解释如何做到这一点。但老实说,我还是不明白。
编辑:我没有分享我的实体代码,因为我认为在这种情况下它并不重要,但如果您需要知道它们的外观,请查看my previous question。
【问题讨论】:
-
我假设您已经看到了这个问题? stackoverflow.com/questions/48569537/…
-
@ILovePHP 是的,谢谢。不幸的是,我对我的情况没有多大意义。
-
您不能禁用 stuff 来自的原则代理对象。但是你应该能够序列化它。你到底想用你的橱柜清单做什么?
-
@Cerad 只需将它们归还,以便我可以显示它们。就像,这是我对他们做任何事情的最后一步。
-
仍然不确定你真正想要的是什么。如果您只想要一些橱柜属性,那么只需将它们拉出并返回即可。否则,下拉到 sql。