2011-01-14 9 views
2

のがこのモデルを考えてみましょう:B_IDフィクスチャで循環参照を作成する方法は?

A: 
    columns: 
    b_id: 
     type: int 
     notnull: false 
    relations: 
    b: B 
    local: b_id 
    foreignAlias: as 


B: 
    columns: 
    a_id: 
     type: int 
     notnull: true 
    relations: 
    a: A 
    foreignAlias: bs 

お知らせをnullにすることができます。 1つまたは複数の備品を持つを作成することは可能ですか?Aオブジェクトは、オブジェクトを自分自身で参照するBオブジェクトとの関係を持ちます。 より一般的な質問、することが可能である:

  1. はA

以上は、単に、それが持つオブジェクトを更新することが可能であるB

  • アップデートを作成A
  • を作成治具?

    A: 
        a_fixture_identifier: 
    
    B: 
        b_fixture_identifier: 
        a: a_fixture_identifier 
    

    それが更新フィクスチャファイルがロードされたと言う:このフィクスチャをロードした後

    A: 
        a_fixture_identifier: 
        b: b_fixture identifier 
    

    : トムの答えの後、私は更新ディレクトリは次のようになりますフィクスチャが含まれてい

    [email protected]:~/project/symfony$ ./symfony doctrine:data-load update --append 
    >> doctrine Loading data fixtures from "update" 
    >> doctrine Data was successfully loaded 
    

    てみましたうまくいっていますが、何も更新していないようです。 2番目のフィクスチャファイルが最初のファイルで宣言されたフィクスチャ識別子についてどのように知っているのか理解できません...どうすればよいですか?

  • 答えて

    1

    フィクスチャはテーブルにデータを追加するためのものです。したがって、フィクスチャデータを使用してオブジェクトを更新することです。

    スキーマで指定した制約に違反しない限り、このデータを好きなように追加できます。リレーションの場合、参照値は参照値の前に来なければならず、そうでなければリレーションは宣言できません。

    複雑なフィクスチャデータを1つのフィクスチャファイルからアップロードする場合があります。私はそれを回避するために、1つのフィクスチャセットをロードし、そのファイルを削除し、別のフィクスチャセットをロードすることに気付いたことがあります。言い換えれば、たとえ関係が単一のフィクスチャファイルに正しく存在していても、symfony/doctrineは(少なくともいくつかのケースで)それらを一度に読み込むことはできないようです。完全なデータベースではなく、「データセット」という言葉を考えてみましょう。

    あるテーブルのフィクスチャファイルが別のテーブルを更新するとは思いません。これが必要な場合は、Doctrineモデルとそのメソッドを使用して少しのデータ読み込みスクリプトを作成することをお勧めします。

    UPDATE:

    誤解元々の質問:私は備品が実際に既存のレコードを更新するために使用することができると思ういけません。 「追加」オプションは、すでにデータが入っているテーブルにさらにデータを追加することです。一般的なフィクスチャは、ビルドされたばかりのテーブルと、テストしたいテーブルでのみ使用されるため、既存のデータに対して実際に更新操作を実行するのではなく、別のものだと思います。このために、別のスクリプトを書くことをお勧めします。

    UPDATE:

    greg0ire:私はこのソリューションを使用し、それが動作します。 、私は私のスクリプトに​​イベントを最初に接続します

    $this->dispatcher->connect('command.post_command', 
        array('MmcCmsDoctrineDataLoadTaskListener', 'fixCircularReferences')); 
    

    その後、私のスクリプトでは、私はタスクが「データ・ロード」であることを確認して、円を閉じるために不足しているリンクを作ります。

    public static function fixCircularReferences(sfEvent $event) 
    { 
        /* @var $task sfTask */ 
        $task = $event->getSubject(); 
        if ($task->getName() == 'data-load') 
        { 
        // make the links here 
        } 
    } 
    

    WARNING:そうあなたは奇妙な問題が発生します、備品に円形を作成しようとしますが、意図的に1人の関係が空でないようにしてください。

    +0

    つまり、1つのフィクスチャファイルでステップ1と2を実行してから、Aレコードを別のフィクスチャファイルで更新できます。フィクスチャファイルの外観は? – greg0ire

    +0

    私の投稿を更新しました – greg0ire

    +0

    @ greg0ire:実際に私は元の質問を誤解してしまったと思います...私は実際には既存のレコードを更新するために治具を使うことはできません。 「追加」オプションは、すでにデータが入っているテーブルにさらにデータを追加することです。一般的なフィクスチャは、ビルドされたばかりのテーブルと、テストしたいテーブルでのみ使用されるため、既存のデータに対して実際に更新操作を実行するのではなく、別のものだと思います。このために、別のスクリプトを書くことをお勧めします。 – Tom