php – Doctrine2多对一关联不会使用JOIN查询
发布时间:2020-12-13 13:27:25 所属栏目:PHP教程 来源:网络整理
导读:我有一个与实体所有者有多对一关系的Car实体.如果我选择所有汽车,Doctrine会在Car表上执行一个查询,然后在每个汽车的Owner表上进行一次查询.因此,获取N个汽车变为N 1个查询,而不是Car和Owner表之间的单个JOIN查询. 我的实体如下: /** @Entity */class Car {
我有一个与实体所有者有多对一关系的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(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |