php – Doctrine2多对一关联不会使用JOIN查询

前端之家收集整理的这篇文章主要介绍了php – Doctrine2多对一关联不会使用JOIN查询前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个与实体所有者有多对一关系的Car实体.如果我选择所有汽车,Doctrine会在Car表上执行一个查询,然后在每个汽车的Owner表上进行一次查询.因此,获取N个汽车变为N 1个查询,而不是Car和Owner表之间的单个JOIN查询.

我的实体如下:

  1. /** @Entity */
  2. class Car {
  3.  
  4. /** @Id @Column(type="smallint") */
  5. private $id;
  6.  
  7. /** @ManyToOne(targetEntity="Owner",fetch="EAGER")
  8. @JoinColumn(name="owner",referencedColumnName="id") */
  9. private $owner;
  10.  
  11. public function getId() { return $this->id; }
  12. public function getOwner() { return $this->owner; }
  13. }
  14.  
  15. /** @Entity */
  16. class Owner {
  17.  
  18. /** @Id @Column(type="smallint") */
  19. private $id;
  20.  
  21. /** @Column(type="string") */
  22. private $name;
  23.  
  24. public function getName() { return $this->name; }
  25. }

如果我想与他们的车主列出汽车,我会这样做:

  1. $repo = $em->getRepository('Car');
  2. $cars = $repo->findAll();
  3.  
  4. foreach($cars as $car)
  5. echo 'Car no. ' . $car->getId() .
  6. ' owned by ' . $car->getOwner()->getName() . '\n';

现在这一切都很有效,除了Doctrine为每辆车发出查询这一事实.

  1. SELECT * FROM Car;
  2. SELECT * FROM Owner WHERE id = 1;
  3. SELECT * FROM Owner WHERE id = 2;
  4. SELECT * FROM Owner WHERE id = 3;
  5. ....

当然我希望我的查询日志看起来像这样:

  1. SELECT * FROM Car JOIN Owner ON Car.owner = Owner.id;

我是否有fetch =“EAGER”或fetch =“LAZY”并不重要,即使我在两个实体之间使用JOIN进行自定义DQL查询,$car-> getOwner()仍会导致Doctrine查询数据库(除非我使用EAGER,在这种情况下,$repo-> findAll()会导致所有这些).

我在这里太累了,这就是它应该工作的方式 – 或者是否有一种聪明的方法来迫使Doctrine进行JOIN查询

至少在1.x Doctrine中如果要查询相关对象,则必须使用DQL.对于您的情况,DQL查询看起来像这样:
  1. //Assuming $em is EntityManager
  2. $query = $em->createQuery('SELECT c,o FROM Car c JOIN c.owner o');
  3. $cars = $query->execute();

猜你在找的PHP相关文章