2011-11-21 8 views
16

私はDoctine2のオブジェクトからそのオブジェクトをロードせずに外部キーを取得できますか?

$productionId = $performance->getProduction()->getId(); 

を行う必要があり、現時点ではその生産のIDが必要な場合、私はパフォーマンスオブジェクトを持っているとき、私は、イベントサイト上で作業し、生産とその公演の間に一対多の関係を持っています文字通り生産IDが必要な場合は、別のデータベースクエリを送信してオブジェクトのどこかに既にある値を取得するのは無駄だと思われます。 これには道がありますか?

+3

大きな質問 - 私はこれを常に実行しており、毎回アソシエーションに参加することなく外部キー値に直接アクセスする方法を見つけることが大好きです。 – cantera

答えて

27

編集2013.02.17:
以下に書いた内容は、もはや真実ではありません。 Doctrineはidフィールドを関連するエンティティに読み込むほど賢明なので、質問に記載されているシナリオではを実行する必要はありません。そのため、プロキシオブジェクトにはすでにidが含まれているため、データベース。以下

古い答え:

ことは可能であるが、それはunadvisedです。

Doctrineは、リレーショナルデータベースのやり方に由来する単なる「アーティファクト」であるため、外部キーに場所がないオブジェクトグラフを形成するという原則に真に従っています。作業。あなたはいつも

  • 関連するエンティティが必要な場合は

    あなたはフェッチ-参加に関連するエンティティを

  • (好ましくリポジトリ上)DQLクエリを書き、

    • 熱心にロードされるように関連付けを書き換える必要がありますそれはあなたが確信していない、と本当に上記のすべてを避けたい場合は、トンを得るためには2つの方法が(私の知っていること)がある

    その上にゲッターを呼び出すことにより、関連エンティティをレイジーロードしましょう彼は関連オブジェクトのIDをロードせずに、リフレクションやシリアライゼーションのようなトリックに頼らずに

    オブジェクトを手元に持っていれば、Doctrineが内部的に使用する内部のUnitOfWorkオブジェクトを取得し、 getEntityIdentifier()メソッドを呼び出し、アンロードされたエンティティ(プロキシオブジェクト)を渡します。遅延ロードをトリガーすることなく、IDを返します。あなたは多対一の関係を持っていると仮定すると

    は、カテゴリに属する​​複数の記事で:

    $articleId = 1; 
    $article = $em->find('Article', $articleId); 
    $categoryId = $em->getUnitOfWork()->getEntityIdentifier($article->getCategory()); 
    

    が2.2を来て、あなただけの外部キーを選択するために、IDENTITY DQLの機能を使用できるようになり、このように:

    SELECT IDENTITY(u.Group) AS group_id FROM User u WHERE u.id = ?0 
    

    開発版にはalready committedです。

    でも、実際には「正しい」方法の1つに固執してください。

  • +0

    あなたの答えをありがとう、ちょうどそれを行って、それは完璧に働いた!私がしたい状況の例は、例えば推薦を生成することです、私は多くの公演を持っており、プロダクションIDに基づいて推薦を生成するオブジェクトにプロダクションIDを渡すことができます。だから私はそれらを必要としないときに私は本当に推奨システムの2つのバージョンを持つ必要はありません生産を読み込むために少し不必要なようです。私は正しいシステムを使用することについてあなたの要点を取りますが、この場合はIDを取得するのが最も簡単な方法です。 – pogo

    +3

    関連するオブジェクトのIDだけが必要な多くのユースケースがあります。パフォーマンスチューニングのためには、OOPの概念を破ることをお勧めします。あなたのアプリケーションを遅くしてはならない援助だけが最後にあります。私はノーベルトのソリューションには感謝していますが、彼の概念的な立場では彼と一緒ではありません。 – bekay

    関連する問題