我有一个Car
与 entity 具有多对一关系的实体Owner
。如果我选择所有汽车,Doctrine 会在Car
表上进行一次查询,然后在Owner
表上为每辆汽车进行一次查询。Car
因此,获取 N 辆汽车变成了 N+1 个查询,而不是和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 查询?