2017-01-16 3 views
0

DQLでオブジェクトをフェッチしてすべてのフィールドと参照を正しく取得するにはどうすればよいですか? 私はエンティティのリストフェッチするために、次のステートメントを使用する場合:結果を反復処理する場合Doctrine DQL、すべての参照とフィールドを含むエンティティ全体を正しくフェッチする

/** 
* @var \Plugin 
* 
* @ORM\ManyToOne(targetEntity="Plugin", inversedBy="pagePlugin", cascade={"persist"}) 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="plugin_id", referencedColumnName="plugin_id", onDelete="CASCADE") 
* }) 
*/ 
private $plugin; 

を、私は、各PagePluginPluginへの1つの参照を持っているPagePluginsのリストを取得します

$pagePlugin->getPlugin() 
DoctrineProxies\__CG__\Plugin::__set_state(array(
    '__initializer__' => 
    Closure::__set_state(array(
)), 
    '__cloner__' => 
    Closure::__set_state(array(
)), 
    '__isInitialized__' => false, 
    'pluginId' => 7, 
    'pluginName' => '', 
    'pagePlugin' => NULL, 
    'pluginMappingValue' => '', 
    'allowedPlugin' => 0, 
    'mainEntity' => 0, 
    'autoCompleteIgnorePlugin' => 0, 
)) 

:、PagePluginsにリンクされているPlugin実体は名前がありません

 $ref = $pagePlugin->getPlugin(); 
     $test = ORM::getDefaultOrm(); 
     $test->refresh($ref); 

名前がフェッチされます:

$ref = {DoctrineProxies\__CG__\Plugin} [11] 
lazyPropertiesDefaults = {array} [0] 
__initializer__ = {Closure} [3] 
__cloner__ = {Closure} [3] 
__isInitialized__ = true 
*Plugin*pluginId = 7 
*Plugin*pluginName = "Header" 
*Plugin*pagePlugin = {Doctrine\ORM\PersistentCollection} [9] 
*Plugin*pluginMappingValue = "Header" 
*Plugin*allowedPlugin = null 
*Plugin*mainEntity = null 
*Plugin*autoCompleteIgnorePlugin = null 

はDoctrineは完全にプラグインを取得するために、なぜDoctrineが部分的にそのオブジェクトをフェッチしない持っていることをDQLに指定することが可能です私は、オブジェクトをリフレッシュ?

答えて

3

Pluginもフェッチしたい場合は、いわゆるフェッチ結合を行う必要があります。あなたはhere in the Doctrine2 documentation chapter 14.2.2. Joinsに参加フェッチで読むことができます。

フェッチジョイン:定期の使用に加えては加入:使用に関連するエンティティをフェッチし、クエリの水和結果に含めるします。あなたのケースでは

あなたは参加フェッチを実行するようなクエリを使用する必要があります。

$this->orm->createQuery('SELECT pp, p FROM PagePlugin pp JOIN pp.plugin p WHERE pp.page = :page')->setParameter('page', $page)->getResult(); 
関連する問題