2016-01-15 11 views
5

Doctrineにアソシエートされたマップされたエンティティがある場合、そのマッピングされたアソシエーションを取得せずにクエリをダウンさせたくない場合があります。Doctrineでアソシエーションマッピングなしのエンティティをフェッチする方法2

たとえば、私は、リンクされたデータベーステーブルのチェーンに関連付けられたエンティティのセットを持っています。彼らはすべてOnetoManyの関連団体であり、製品ページのマトリックスの価格階層として機能します。

SitePage->SiteMatrix->SiteItems->SiteItemPrices. 

関連マッピングが完全に動作し、私が取得するfindBy方法を使用する場合、ルートは、チェーンダウンマップされたエンティティを表す配列を含むオブジェクトSitePage:彼らはように表現することができます。言い換えれば、SitePageオブジェクトにはすべての価格が含まれているすべてのアイテムを含むすべての行列が含まれています。ここまでは順調ですね。

私の問題は、サイトのページのリストを取得するたびに、doctrineがアソシエーションマッピングツリー全体を歩いていて、非常に遅いデータベース全体を返すことです。いつか私は自分のSitePageエンティティをIDで取得し、マップされた関連付けをすべて含んでいないだけです。

私は団体の怠惰と、余分な遅延ロードに見てきたが、彼らは唯一の公式ドキュメントは役に立ちから遠いなどをfindBy特定の機能に影響を与え、そしてないように見える:スタックオーバーフローの http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html

他の同様の質問を持っています返されなかった: Doctrine 2 Association Mapping Overhead?

マッピングされた関連付けなしでエンティティを簡単に取得する方法はありますか?私が現在見ることができる最も簡単な方法は、それぞれのデータベーステーブルに対して2つのエンティティを作成することです.1つはアソシエーションマッピングで、もう1つは必要な別の状況では使用しません。あなたが単にエンティティを取得し、それを他のエンティティにリンクするのか、それともそれを単独でフェッチするのかを指定することはできません。

この件に関するお問い合わせありがとうございます。

+0

Doctrineは、デフォルトでロードアソシエーションを遅延させる必要があります。あなたのすべての団体が熱心な負荷に設定されているようです。アソシエーションの問題を除外するために、アソシエーションマッピングを使用して2つのエンティティのコードを追加できますか? – JimL

+0

ご回答いただきありがとうございますが、この問題は1年以上経過しています。私はシリアライザを使用してエンティティを配列にシリアル化していたことが判明しました。このシリアライザは、すべてのゲッタ関数をアソシエーションマッピングツリーで呼び出していました。 JMSシリアライザバンドル内の除外、最大深度、およびグループ機能について学ぶと、すべてが明確になり、より多くの制御で関連付けを行うことができました。 – Asq

答えて

2

JMSSerializerの除外戦略が役立ちます。

まず、デフォルトですべてのプロパティを除外する:

// ... 

use JMS\Serializer\Annotation as JMS; 

/** 
* @ORM\Entity 
* @JMS\ExclusionPolicy("all") 
*/ 
class Foo 

次に、あなたの特性を除外したり、公開することを選択した:

/** 
* @ORM\Column(type="string") 
* @JMS\Expose 
*/ 
protected $name; 

また、あなたの団体のために、あなたが制限するMaxDepthを使用することができますあなたの結果の関連エントリ。例:このように

// Entity 
/** @MaxDepth(1) */ 
private $selfAssociatedEntries; 

// Controller 
use JMS\Serializer\SerializationContext; 

$serializer->serialize($data, 'json', SerializationContext::create()->enableMaxDepthChecks()); 

は、エンティティの意志がシリアライズ$selfAssociatedEntriesが含まれていますが、$selfAssociatedEntries$selfAssociationEntries性質を持っていません。
シリアル化は最初の親オブジェクトに制限されています。

Groups

はあなたには、いくつかのアクションのためのプロパティを公開して、他のためにそれらを除外することを可能にする強力な機能です:について

// Property 'name' is exposed 
$serializer->serialize($data, 'json', SerializationContext::create()->setGroups(array('default'))); 

:あなたのコントローラで

/** 
* @ORM\Column(type="string", length=255, nullable=true, unique=false) 
* @JMS\Groups({"default"}) // Set the group to expose the property 
*/ 
protected $name; 

、直列化のために使用されるグループを設定します詳細は、Exclusion Strategiesのドキュメントの章をご覧ください。

+0

このコンセプトを徹底的に説明していただきありがとうございます。 JMSSerializerの除外戦略を使用すると、ドクトリン関連マッピングは非常に強力なツールになります。 refの公式文書 - http://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies – Asq

+0

ご迷惑をおかけしますようお願い申し上げます。あなたがmaxDeprhのより良い説明を持っているなら、私に言うことをためらうことなく、私は私を改善するでしょう。 – chalasr

+0

これはすべていいですが、これは依然として基礎となるクエリに影響しますか?これはプレゼンテーションですが、クエリはまだ正しく実行する必要がありますか? –

関連する問題