会員情報の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());
}