【问题标题】:How to disable returning other entities references in Symfony 4?如何在 Symfony 4 中禁用返回其他实体引用?
【发布时间】: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。

标签: php symfony symfony4


【解决方案1】:

当您使用->addSelect('cabinet') 时,您将从cabinet 获取所有数据。如果您只需要某些属性,请改为使用以下命令指定它们:

->select('cabinet.id, cabinet.time, cabinet.productCategory')

【讨论】:

  • @Doesitmatter,对不起,我误解并更新了我的答案。
  • 因为这个答案是完全错误的。只需停止使用 php 的 json_encoding 并切换到更好的 Serializer。
  • 正是我需要的。谢谢!
  • 只是偶然。祝你好运,代码可维护性有数十个这样的查询。改用 JMS 序列化程序并学习如何正确序列化对象。
  • @Emix,我认为这个问题与序列化无关,只是关于获取一些属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 2019-06-16
  • 1970-01-01
  • 2014-08-30
  • 2019-04-29
  • 2018-08-08
  • 2019-04-18
相关资源
最近更新 更多