2012-03-22 14 views
2

私はdoctrineのドキュメントで扱っている自己参照表を持っています(すでにアプリケーション全体で頻繁に使用されているため、ネストされたツリーへの変更は現在のオプションではありません)。symfony2隣接関係リストのモデルでのフォームの使用

http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/association-mapping.html#one-to-many-self-referencing

テーブルの構造は次のようになります。

+----+----------+--------+ 
| id | parentID | Name | 
+----+----------+--------+ 
| 1 |  null | Name 1 | 
| 2 |  1 | Name 2 | 
| 3 |  1 | Name 3 | 
| 4 |  2 | Name 4 | 
| 5 |  1 | Name 5 | 
-------------------------- 

今まで私たちの形で私たちは私たちのフォームコンテンツ全体のエンティティを使用してきた上、すなわち

 $builder->add('hierarchyid', 'entity', array(
      'class' => 'AcmeTestBundle:Hierarchies')     

うまく動作しますが、テーブルのポイントを設定するためにこれを修正できるようにしたいと考えています:

 ->add('hierarchyid', 'entity', array(
      'class' => 'AcmeTestBundle:HierarchiesTest', 
      'query_builder' => function(HierarchiesTestRepository $repo) 
    {return $repo->findBy??????} 

しかし、私は精神的なブロックをどのようにこれを完了するには、任意のアイデアをヒットしましたか?

これらのエンティティの配列コレクションをビルドするコードは既に用意されていますが、これは別の場所で使用されていますが、フォームタイプでdoctrine配列コレクションを実装する方法についてはよくわかりません。

private function createNodeArray($node) 
{ 
    $this->hierarchyArrayCollection->add($node); 
    foreach ($node->getChildren() as $hierarchy) 
    { 
     $this->createNodeArray($hierarchy); 
    }   
} 

答えて

0

興味がある人々のために、私は最後に一緒に行った解決策でした配列を生成し、エンティティではなく、次のような選択肢のフィールドタイプを使用します。

->add('hierarchyid', 'choice', array(
       'choices' => $hierarchy) 
3

query_builderオプションはQueryBuilderオブジェクトを返す必要がありますし、私はあなたのfindAllById()方法は、実際のデータを返すと仮定します。あなたはそれを変更する必要があり、それ以外は)

、あなたはおそらく、リストに表示させるフィールドを示すためにpropertyオプションを追加する必要があります...

+0

これは私の問題です。私はfinaAllByIdメソッドを再帰的に実行させ、オブジェクトを構築してから、query_builderに戻すことはできません。私はこれをフォームに戻す方法を理解できません。 find( '2')のように、通常のようにQueryBuilderを返すだけであれば、現在子を返さないでしょう。 プロパティの場合、私のエンティティはこれに対処するためにtoStringを使用しています。 – MadManMonty