Symfony2/Doctrine:加载仅相关实体的子集

3
一个Symfony2应用程序有一个实体Job,它有一个tasks属性,是一组Task实体。 Job->getTasks()被用来迭代给定作业的任务集合。Doctrine会惰性加载封装在tasks属性中的Task实体。我猜测它们是在调用getTasks()时加载的。
除了额外的细节之外,Job实体看起来像这样:
<?php

class Job
{        
    /**
     * @var \Doctrine\Common\Collections\Collection
     * @ORM\OneToMany(targetEntity="Example\Bundle\Entity\Task\Task", mappedBy="job")
     */
    private $tasks;

    public function __construct()
    {
        $this->tasks = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getTasks()
    {        
        return $this->tasks;
    }
}

我经常需要访问工作中仅有的一小部分任务(也许是1000个中的10个),目前通过遍历getTasks()并挑选相关id的任务来实现。
对于大量任务(数千,数万),从数据库加载任务集合可能需要很长时间。
我希望减少获取子任务所需的时间。我可以使用自定义实体仓库通过id和工作检索Task实体来实现这一点。
我想知道Symfony2和/或Doctrine2是否已经存在用于执行此操作的内置功能。
我的想法是具有相关实体集合的实体是常见情况(例如博客文章和评论),并且在实体级别上可能会有一些与分页相关的概念,以仅检索相关实体的子集。
是否有我需要的内置Symfony2功能?
更新1:
我理想情况下仍然希望能够遍历Job->getTasks(),并知道它将返回我已经指定的一小部分任务。
1个回答

4

谢谢,我会看一下。协会的名称本身听起来就像是朝着正确的方向前进。 - Jon Cram
Extra Lazy Association 是一个有价值的特性,但这并不意味着我不能指定在迭代 Job->getTasks() 时要加载哪个子集的“Task”实体。这是一个不错的方面,但我认为它并没有回答我的问题。 - Jon Cram
在这种情况下,您可以创建一个包装器来封装 Collection#slice($offset, $length = null); 方法。因为文档指出,集合将仅加载在 slice() 范围内定义的实体。 - Mun Mun Das

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接