Doctine 2.0キャッシングとDoctrineの2.xのを使用してデフォルト
自分のドメイン内のエンティティは、一列のみでのテーブルにマップされている場合は、いくつかの - ので、これはそうではない - これは、計画道路(下の追加の複雑さをサポートすることですYAGNIに合う)。一例として、
は、現時点では、単純なエンティティ私のアプリケーションで
Category\Type:
type: entity
table: category_type
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
type: string
を考える私は1つのカテゴリタイプのみ(名=「定期的な」)が、私は作成するたびに新しいカテゴリを持っている(エンティティが示されていません - あなたの想像力を使用します;それはCategory \ TypeとN:1の関係を持っています)タイプをカテゴリーに関連付ける必要があります。これは、データベースから単一行を取り出して関連付けを設定する必要があることを意味します。
$category = new Category();
$type = $em->getRepository('Category\Type')->findByName('regular');
$category->setType($type);
$em->persist($category);
$em->flush();
私はこれを避ける方法を知りたいと思います。
私はちょうどこのような新しいタイプを使用している場合...
$category = new Category();
$type = new Category\Type();
$type->setName('regular');
$category->setType($type);
$category->setId(1); // <-- This gets incremented anyway after the persist is called
$em->persist($category);
$em->flush();
その後の教義は、名前の欄には、データベースにユニークな制約があるため、実際には、それが失敗した(新しいエンティティとしてタイプを挿入しよう)。
私は上記の操作を行い、その後、
http://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-objects.html#merging-entities
をマージ使用することを試みた。しかし、同じことが起こります。
私はここで何が欠けていますか?新しいオブジェクトを既にデータベースにあるものとして扱うためにdoctrineを取得するにはどうしたらいいですか?また、コードレベルでマネージエンティティをキャッシュする方法を教えてください。
これをコードで効果的に 'キャッシュ'するのは適切ではありません - 他のキャッシュメカニズムの1つを使用する必要がありますか?
私はあなたが傾けると思います。新しいオブジェクトを作成するときに、既存のオブジェクト 'Category \ Type'にアソシエートする必要があります。それは、*新しい*データベースに新しい行を作成し、あなたのアソシエーションはそのオブジェクトを取得する必要があります既存のもの。 Doctrineの設計方法は、DBの行ではなくオブジェクトのインスタンスで行います。 – venimus