如果您在 Doctrine 中有一组关联映射实体,有时您可能希望检索这些实体而不获取其映射的关联并减慢查询速度。
例如,我有一组实体,这些实体在链接数据库表链中关联映射。它们都是一对多关联,并充当产品页面上矩阵中的价格层次结构。它们可以表示为:
SitePage->SiteMatrix->SiteItems->SiteItemPrices.
关联的映射工作得很好,当我使用 findBy 方法获取根 SitePage 对象时,它包含表示链下映射实体的数组。换句话说,SitePage 对象包含所有矩阵,其中包含包含所有价格的所有项目。目前为止,一切都好。
我的问题是,每次我在我的网站上获得页面列表时,教义都是遍历整个关联映射树,并返回给我整个数据库,这非常慢。有时我只想通过 ID 获取我的 SitePage 实体,而不包含所有映射的关联。
我已经研究了关联的懒惰和额外延迟加载,但它们似乎只影响某些功能,而不是 find By 等。官方文档远没有帮助:http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html
关于Stack Overflow的其他类似问题尚未得到解答:教义 2 关联映射开销?
有没有一种简单的方法来获取没有映射关联的实体?我目前可以看到的最简单方法是为每个数据库表创建两个实体,一个具有关联映射,另一个没有在需要它们的单独情况下使用。对我来说,您不能简单地获取一个实体并指定是要链接到其他实体还是单独获取它,这对我来说似乎很奇怪。
感谢您提供有关该主题的任何信息。
JMSSerializer 排除策略可以为您提供帮助。
首先,默认排除所有属性:
// ...
use JMS'Serializer'Annotation as JMS;
/**
* @ORM'Entity
* @JMS'ExclusionPolicy("all")
*/
class Foo
然后,选择排除或公开您的属性:
/**
* @ORM'Column(type="string")
* @JMS'Expose
*/
protected $name;
此外,对于关联,您可以使用MaxDepth
来限制结果的关联条目。例:
// Entity
/** @MaxDepth(1) */
private $selfAssociatedEntries;
// Controller
use JMS'Serializer'SerializationContext;
$serializer->serialize($data, 'json', SerializationContext::create()->enableMaxDepthChecks());
与此类似,您的实体将包含序列化的$selfAssociatedEntries
,但$selfAssociatedEntries
没有 $selfAssociationEntries
属性。
序列化仅限于第一个父对象。
Groups
是一项强大的功能,允许您公开某些操作的属性并为另一个操作排除它们:
/**
* @ORM'Column(type="string", length=255, nullable=true, unique=false)
* @JMS'Groups({"default"}) // Set the group to expose the property
*/
protected $name;
在控制器中,设置用于序列化的组:
// Property 'name' is exposed
$serializer->serialize($data, 'json', SerializationContext::create()->setGroups(array('default')));
有关详细信息,请查看文档的排除策略一章。