Symfony Doctrine2急切加载运行多个查询,而不是1个查询

Symfony Doctrine2急切加载运行多个查询,而不是1个查询,symfony,doctrine-orm,eager-loading,Symfony,Doctrine Orm,Eager Loading,我将Symfony2与Doctrine2(最新版本)一起使用,并定义了此关系: /** * @ORM\OneToMany(targetEntity="Field", mappedBy="event", fetch="EAGER") * @ORM\OrderBy({"name" = "ASC"}) */ protected $fields; 关系的另一面定义为: /** * @ORM\ManyToOne(targetEntity="Event", inversedBy="fields",

我将Symfony2与Doctrine2(最新版本)一起使用,并定义了此关系:

/**
 * @ORM\OneToMany(targetEntity="Field", mappedBy="event", fetch="EAGER")
 * @ORM\OrderBy({"name" = "ASC"})
 */
protected $fields;
关系的另一面定义为:

/**
 * @ORM\ManyToOne(targetEntity="Event", inversedBy="fields", fetch="EAGER")
 * @ORM\JoinColumn(nullable=false, onDelete="CASCADE")
 */
protected $event;
在执行“fetchOnyById”时,条令运行2个查询。1获取对象本身,1获取相关字段。 我希望这是一个加入,但它不是

在控制器中完成后,我将对象传递给twig。 在那里,我再次检索字段作为对象的属性。 这将导致运行另一个查询以再次检索字段


显然我做错了什么,因为我只希望运行1个查询,而实际运行3个查询。

我认为出现这种情况的原因是因为您正在获取实体,而不是特定的查询。信条的思想是,您正在获取对象,而不是与数据库交互,而是与对象资源交互,就好像它们都与存储的实体关联/引用一样。如果您需要像您描述的那样的查询,那么最好使用DQL,但此时您并没有获取创建的实体,而是获得了一个自定义结果

我希望这是有道理的


基本上,您使用的默认关联是获取关联对象,而不是关联查询。

基本上,您的想法不是像处理SQL一样,而是像处理具有真实关联的对象一样,让条令加载并创建这些情况。如果您遇到需要连接查询的情况,那么可以使用DQLSo轻松地创建它。因此,基本上,Doctrine2中的急切加载就是这样工作的。相关对象的单独查询将在对象的第一个查询之后运行。然后,使用即时加载比我想象的要少一点,一般来说,最好使用延迟加载。在特殊情况下,联接可能很有用,但这将是存储库中运行自定义查询的额外方法。基本上:我对这种行为的期望是错误的。tnx!嗯,也许吧。请注意您所做的,因为有时您可能会在一些简单的事情上拉取100多个查询,因为您可能只请求了X实体,但使用该实体后,您开始调用每次查询时都会拉取的关联。我尝试混合使用DQL和direct实体,这取决于哪个更合适。我注意到在一些页面上发生了类似的事情。Querycount增长到近100。不过,数据库不会那么大,目前它比运行1个大连接要快。从数据库获取关系时,是否可以运行自定义DQL查询?这样我就可以一次加载所有相关的对象。我想如果你想将它们作为关联对象,你至少需要使用一些。但是你可以保持低计数。例如,查询主实体。然后有一个自定义存储库函数来查询所有关联实体的关联a。又称为用户a的查询,然后有另一个函数来查询他的所有博客文章以将它们关联到他。DQL是介于两者之间的工具,您所需要的只是作为一个查询获取的特定信息,这些信息可能不需要是关系实体,例如在特定页面上构建显示。但是,如果您试图将该内容设置为表单,您可能希望直接使用实体,否则它会变得复杂。