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

我有一个与实体所有者有多对一关系的Car实体.如果我选择所有汽车,Doctrine会在Car表上执行一个查询,然后在每个汽车的Owner表上进行一次查询.因此,获取N个汽车变为N 1个查询,而不是Car和Owner表之间的单个JOIN查询.

我的实体如下:

/** @Entity */
class Car {

  /** @Id @Column(type="smallint") */
  private $id;

  /** @ManyToOne(targetEntity="Owner",fetch="EAGER")
      @JoinColumn(name="owner",referencedColumnName="id") */
  private $owner;

  public function getId()    { return $this->id; }
  public function getOwner() { return $this->owner; }
}

/** @Entity */
class Owner {

  /** @Id @Column(type="smallint") */
  private $id;

  /** @Column(type="string") */
  private $name;

  public function getName() { return $this->name; }
}

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

$repo = $em->getRepository('Car');
$cars = $repo->findAll();

foreach($cars as $car) 
  echo 'Car no. ' . $car->getId() . 
       ' owned by ' . $car->getOwner()->getName() . '\n';

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

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

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

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查询看起来像这样:
//Assuming $em is EntityManager
$query = $em->createQuery('SELECT c,o FROM Car c JOIN c.owner o');
$cars = $query->execute();

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...