【问题标题】:How to load an entity in Symfony without special fields如何在没有特殊字段的情况下在 Symfony 中加载实体
【发布时间】:2016-11-15 12:15:43
【问题描述】:

我想在我的控制器中加载一个实体,但不希望该实体包含所有字段。我之前使用 Jms-Serializer 进行过此操作,您可以在其中使用 Groups Annotations,以避免加载特殊字段。但是我在那里你必须将你的对象序列化为 json/xml 等。 而且我不希望它序列化,我只想要该组功能。我搜索了这个网站和互联网,但没有找到任何解决我的问题的方法。

希望有人明白我的意思并得到一个想法:)

【问题讨论】:

  • 我不确定你到底想达到什么目标,但据我所知,你可能想看看entity repositories 如果你发布一些代码,那么对人们来说可能会更容易了解您想要实现的目标
  • 您可以从您的实体存储库中获取数组结果(不包含某些字段)
  • 如果你想加载一个实体,我们可以假设你想要它作为一个对象而不是一个缩减数组吗?如果它一个对象,为什么不忽略你不需要的道具呢?或者只是在实体上创建一个返回您需要的位的方法?

标签: php symfony doctrine


【解决方案1】:

有几种可能:

  1. 使用部分对象(这将提供在水合期间仅填充指定属性的对象):http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/partial-objects.html#partial-objects

这很危险,您应该格外小心,因为从各个角度来看,它都像是一个满载的实体。您必须知道为什么一个字段为空 - 只是因为它是空的,或者只是因为它在水合期间没有被填充。

  1. 不要水合对象,而是查询 数组作为水合结果(您可以再次指定要返回的数组键):http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#array-hydration

将其用于需要大量只读数据和复杂联接的性能敏感查询。但请注意,您没有任何可以使用 Doctrine 管理的实体(例如更新、删除等)。

  1. 使用 DTO,它们是对象,但不是 Doctrine 管理的实体,您可以再次使用新语法指定您想要补充的内容:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#new-operator-syntax

与 2) 中的建议基本相同,但这次您将获得对象。因此,您可以使用您所有的 OOP 智慧。

  1. 创建您自己的自定义补水模式 - 您可以自行定义实体应如何补水:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#custom-hydration-modes

非常先进的水平。仅当您需要针对多个实体的特殊补水模式并且确实没有其他选项可以提供您需要的性能和质量时才有用。

【讨论】:

    【解决方案2】:

    你可以使用部分对象,但你应该小心。例如:

    $q = $em->createQuery("select partial u.{id,name,otherField} from MyApp\Entity\User u");
    

    您可以在此处阅读更多内容:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/partial-objects.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      相关资源
      最近更新 更多