エンティティとCar
多対1の関係にあるエンティティがありますOwner
。すべての車を選択すると、Doctrineはテーブルに対してCar
1つのクエリを実行し、続いて車ごとOwner
にテーブルに対して1つのクエリを実行します。したがって、N台の車をフェッチすると、とテーブル間の単一のJOINクエリではなく、N+1クエリになります。Car
Owner
私の実体は次のとおりです。
/** @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"
は関係ありません。2つのエンティティ間でJOINを使用してカスタムDQLクエリを実行して$car->getOwner()
も、Doctrineはデータベースにクエリを実行します(EAGERを使用しない限り、$repo->findAll()
すべてのエンティティが発生します)。
私はここで疲れすぎていますか?これはそれが機能するはずの方法です-またはDoctrineに代わりにJOINクエリを実行させる賢い方法はありますか?