Fro*_*ode 8 php mysql doctrine-orm
我有一个Car与实体有多对一关系的实体Owner.如果我选择所有的汽车,确实学说在一个查询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; }
}
Run Code Online (Sandbox Code Playgroud)
如果我想与他们的车主列出汽车,我会这样做:
$repo = $em->getRepository('Car');
$cars = $repo->findAll();
foreach($cars as $car)
echo 'Car no. ' . $car->getId() .
' owned by ' . $car->getOwner()->getName() . '\n';
Run Code Online (Sandbox Code Playgroud)
现在这一切都很有效,除了Doctrine为每辆车发出查询这一事实.
SELECT * FROM Car;
SELECT * FROM Owner WHERE id = 1;
SELECT * FROM Owner WHERE id = 2;
SELECT * FROM Owner WHERE id = 3;
....
Run Code Online (Sandbox Code Playgroud)
当然我希望我的查询日志看起来像这样:
SELECT * FROM Car JOIN Owner ON Car.owner = Owner.id;
Run Code Online (Sandbox Code Playgroud)
我是否有fetch="EAGER"或fetch="LAZY"没有关系,即使我做一个自定义的DQL查询与两个实体之间的连接,$car->getOwner()还是引起学说来查询数据库(除非我用心切,在这种情况下,$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();
Run Code Online (Sandbox Code Playgroud)