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

时间:2013-08-10 06:35:20

标签: 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", fetch="EAGER")
 * @ORM\JoinColumn(nullable=false, onDelete="CASCADE")
 */
protected $event;

在执行“fetchOnyById”时,Doctrine会运行2个查询。 1获取对象本身,1获取相关字段。 我希望这是一个联接,但事实并非如此。

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

显然我做错了,因为我预计只会运行1个查询而实际运行3个。

1 个答案:

答案 0 :(得分:3)

我认为发生这种情况的原因是因为您提取的是实体,而不是特定的查询。 Doctrine的想法是你获取对象,不是与数据库交互而是与对象资源交互,好像它们都像存储实体一样被关联/引用。如果您需要像您所描述的那样的查询,那么最好使用DQL,但此时您不会获取创建的实体,而是获得自定义结果。

我希望这是有道理的。

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