2011-06-27 5 views
0

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つを使用する必要がありますか?

+0

私はあなたが傾けると思います。新しいオブジェクトを作成するときに、既存のオブジェクト 'Category \ Type'にアソシエートする必要があります。それは、*新しい*データベースに新しい行を作成し、あなたのアソシエーションはそのオブジェクトを取得する必要があります既存のもの。 Doctrineの設計方法は、DBの行ではなくオブジェクトのインスタンスで行います。 – venimus

答えて

1

独自のアプローチが適切です。

$category = new Category(); 
$type = $em->getRepository('Category\Type')->findByName('regular'); 
$category->setType($type); 
$em->persist($category); 
$em->flush(); 

これはDoctrineの設計方法です。

あなたがしようとするのは、既に存在するものにnameプロパティを設定することによって、オブジェクトのインスタンスを取得(検索)することです。これは間違っています。それはあなたの子供ジョン・レノンに電話をかけ、ビートルズを復活させることを期待するようなものです。

+0

LOLの類推 - 私はそれを他のキャッシュ機構に渡します。私はあなたに正しいことを記す前に、これをしばらく開いたままにしておきます。 – calumbrodie

関連する問題