2017-11-03 13 views
2

私は階層化されたリレーションを使用するアクションに取り組んでいます。 私は関係所有カードを持っているPlayer Entityを持っています。 Relation CardLevelにはリレーションカードがあります。私はSymfony Doctrineレイジーリレーションがどこでフェッチされるかを知るにはどうすればいいですか?

SELECT * FROM card_level WHERE card_id = ? 
のようにたくさんの呼び出しがあり、参加し、これらの関係
public function findWithOwnedCards($id) 
{ 
    $qb = $this->createQueryBuilder('player') 
     ->join('player.ownedCards', 'ownedCards') 
     ->join('ownedCards.card', 'cardLevel') 
     ->join('cardLevel.card', 'card') 
     ->addSelect(['ownedCards']) 
     ->addSelect(['cardLevel']) 
     ->addSelect(['card']) 
     ->where('player.id = :id') 
     ->setParameter('id', $id); 
    return $qb->getQuery()->getSingleResult(); 
} 

しかし、残念ながら、symfonyのプロファイラは、私に指示を選択する方法を作成しましたので、私はこのために

/** 
* @param Player $player 
* @Route("/{id}/cards", name="loki.tuo.ownedcard.cards.show", requirements={"id":"\d+"}) 
* 
* @ParamConverter("player", class="LokiTuoResultBundle:Player", options={"repository_method" = "findWithOwnedCards"}) 
* @return Response 
* @Security("is_granted('view.player', player)") 
*/ 
public function showCardsForPlayerAction(Player $player) 
{ 
    $allCards = $player->getOwnedCards(); 
    $allCards = Collection::make($allCards)->sortBy(function (OwnedCard $elem) { 
     //$elem->getCard() calls the getName() method on CardLevel which delegates it to Card 
     return $elem->getCard()->getName(); 
    }); 
    $deck = $allCards->filter(function (OwnedCard $item) { 
     return $item->getAmountInDeck() > 0; 
    }); 
    $combined = $deck->map(function (OwnedCard $item) { 
     return $item->toDeckString(); 
    }); 
    $formOptions = ['attr' => ['class' => 'data-remote']]; 
    $ownedCardForm = $this->createForm(OwnedCardType::class, null, $formOptions); 

    $massOwnedCardForm = $this->createForm(MassOwnedCardType::class, null, [ 
     'action' => $this->generateUrl('loki.tuo.ownedcard.card.add.mass', ['id' => $player->getId()]), 
     'method' => 'POST', 
    ]); 
    //Render Template 

を使用しています

(わかりやすくするためにクエリを短縮しました) これは、ある時点で、Symfony/Doctrineは結合されたリレーションシップ彼らは怠け者だと思っています。

私の質問:どのようにクエリを実行するのか、どこで、いつ実行できますか?私がブレークポイントを設定したり、例外をスローしてスタックトレースを見て、どこから来るのかを知ることができるコードがありますか?

+0

から例innerJoinを使用してみてください代わりに参加します。それは私がそれをたくさん使用すると動作するはずです – goto

+0

これは何が変わる可能性があるのか​​分かりません。デバッガの内部では、データが正しくフェッチされていることがわかります。しかし、どういうわけか、まだどこかにlazyloadingがあります – Loki

+0

あなたのコードの後に​​別のクエリがある可能性はありますか? – goto

答えて

関連する問題