web-dev-qa-db-ja.com

関連付けのあるエンティティを挿入するときに、エンティティを取得する代わりにFKを使用する方法はありますか?

関連付けのあるエンティティを挿入する必要があります。

関連するエンティティのFKがすでにある場合、FKだけが入力された状態でプライマリエンティティをデータベースに挿入する方法はありますか?

それとも私はいつもしなければなりませんか

  • fKを介して関連エンティティを取得します。
  • アソシエーションを参照してプライマリエンティティのプロパティを設定し、
  • 次に、persistメソッドを呼び出します。
38
blacktie24

参照プロキシ が必要です

投稿とタグがあるとしましょう。投稿には多くのタグがあります。たくさんのチェックボックスをチェックしたユーザーからたくさんのタグを受け取ります。

以下では、最初に各タグエンティティをフェッチせずに、既存の投稿にタグを追加します。これは、EntityManager::getReference()によって生成された参照プロキシを使用して行われます。

$tag_ids = $_POST['tag_id']; // an array of integers representing tag IDs.
$post = $em->getRepository('Post')->find($post_id); // returns a Post entity.

foreach($tags_ids as $tid){
   $post->addTag($em->getReference('Tag',$tid));
}
$em->persist($post);
$em->flush();
65
timdev

参照プロキシの使用に関して
私の調査では、これは次のように部分的にしか解決策ではありません。

はい、(プロキシレコードを作成するため)関連レコードを事前に取得する必要はありませんが、更新トランザクションをフラッシュ(コミット)すると、最初にselectステートメントを実行して関連レコードを取得し、次に実行するだけです。更新(データベースへのオールインワンヒット)。
これは非効率的であり、必要ではないはずです(外部キーIDがあるのに、なぜレコードを取得するのですか?)

したがって、完全なソリューションではありませんが、データベースへの単一の接続(これは良いことです)とわずかに単純化されたコードだけが得られます。

現時点でこれに対する解決策があるかどうかはわかりません... ??
うまくいけば、doctrine bodsは将来更新され、プロキシロジックを使用する場合は、自動的にパフォーマンスが向上するはずです...

4
MarkOfSine

関連するエンティティを取得して、関係を作成する必要があります。

私はあなたがcould DBALレイヤーを介してデータベースに直接アクセスすることによって手動で関係を指定すると仮定しますが、これはお勧めしませんし、試したこともありません。

0
Cobby