Php 延迟加载实体的条令存储库机制是如何工作的?

Php 延迟加载实体的条令存储库机制是如何工作的?,php,entity-framework,symfony,doctrine-orm,doctrine,Php,Entity Framework,Symfony,Doctrine Orm,Doctrine,因此,我想了解条令存储库机制是如何工作的 对于我的实体,我使用注释,因此结果对象是在脚本执行期间构建的 我想了解一下实现从另一个实体延迟加载实体的可能方法 具体地说,运用教义,我有能力。这种抓取是以一种惰性的方式完成的:仅当我调用该方法从查询它的数据库中获取有关它所加载的实体的信息时 现在,我想更好地理解这个机制:实体如何实现存储库方法? 我如何重现这种机制,以便在其他类似于数据库数据检索的上下文中实现它 由于生成的对象非常大,是否有人可以让我走上正确的道路? 我应该阅读哪些课程来理解该机制?

因此,我想了解条令存储库机制是如何工作的

对于我的实体,我使用注释,因此结果对象是在脚本执行期间构建的

我想了解一下实现从另一个实体延迟加载实体的可能方法

具体地说,运用教义,我有能力。这种抓取是以一种惰性的方式完成的:仅当我调用该方法从查询它的数据库中获取有关它所加载的实体的信息时

现在,我想更好地理解这个机制:实体如何实现存储库方法? 我如何重现这种机制,以便在其他类似于数据库数据检索的上下文中实现它

由于生成的对象非常大,是否有人可以让我走上正确的道路? 我应该阅读哪些课程来理解该机制? 是否有任何文章/帖子可以更好地解释该机制是如何实现的?
有更好(或更简单)的实现方法吗?

您可以为实体创建自定义存储库:

一旦拥有了自己的自定义存储库类,就可以创建查询,在一个查询中获取所需的所有信息,而不是依赖于延迟加载

假设您有一个产品实体,其中有一个或多个类别实体使用多个关系,您可以在自定义存储库中创建一个函数,在一个查询中获取所有产品及其类别:

   public function fetchProductsWithCategories()
    {
        return $this->getEntityManager()
            ->createQuery(
                'SELECT p, c FROM Product p join p.categories c'
            )
            ->getResult();
    }
然后在控制器中,您会有如下内容:

$repo = $this->getDoctrine()->getManager()->getRepository('Product');
$products = $repo->fetchProductsWithCategories();

编辑:select

原则中缺少的c实际上创建了一个额外的对象(想想代理),该对象记录了实际访问的属性

请参阅文档中的此部分:

32.4.2. 关联代理 条令使用代理对象的第二个最重要的情况是在查询对象时。当您查询与另一个配置为惰性的对象具有单值关联的对象时,如果没有在同一查询中加入该关联,则原则会将代理对象放置在通常关联对象的位置。就像其他代理一样,它将在第一次访问时透明地初始化自己


我认为在条令开发者的文章中可以找到关于延迟加载的最佳描述。


其主要思想是在产品的类别列表中插入一组对象,这些对象是类别的子类。当从数据库中检索产品时,这些对象被称为“代理对象”,并“动态”创建。这些代理对象与类别对象具有相同的接口,但在需要时添加了从数据库加载实际类别项的功能。

感谢您的回复dk80,但我想从技术上了解该机制是如何实现的。我不打算使用理论,而是在我正在编写的另一个库中实现相同的原则,这不是关于数据库,而是关于数据。我想了解类的层次结构和它们背后的概念,以便能够在我的脚本中使用相同的方法。问题是延迟加载实体如何工作,但您的答案看起来像是在解释另一个主题