gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 06:32:40 25 4
gpt4 key购买 nike

我有一个 Car 实体,它与实体 Owner 存在多对一关系。如果我选择所有汽车,Doctrine 在 Car 表上执行一次查询,然后在 Owner 表上为每辆汽车 执行一次查询。因此,获取 N 辆汽车变成了 N+1 查询,而不是 CarOwner 表之间的单个 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();

关于php - Doctrine2 多对一关联不会使用 JOIN 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4167807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com