会員情報のEntity Customer と都道府県のEntity Pref がManyToOneの関係にあるとする。
例えば以下のようなコードを書くとlazyloadでクエリが N+1 回実行されてしまう。
$qb = $this->entityManager->createQueryBuilder();
$Customers = $qb
->from(Customer::class, 'c')
->select('c')
->getQuery()
->getResult();
foreach ($Customers as $Customer) {
dump($Customer->getPref()->getName());
}
この場合は明示的にJoinしてやるとクエリの数が減らせる。
addSelect() で指定してやることであらかじめJoinしたデータを取得してくれる。
$qb = $this->entityManager->createQueryBuilder();
$Customers = $qb
->from(Customer::class, 'c')
->select('c')
->addSelect('p')// この行を追加
->leftJoin('c.Pref', 'p')// この行を追加
->getQuery()
->getResult();
foreach ($Customers as $Customer) {
dump($Customer->getPref()->getName());
}