0

カスタム フィールド タイプの作成に問題があります。

私が持っているのはエンティティです:

Category  
Id | Name | parent_id    

最終的に欲しいのは、次のような select-Field です。

Category 1
- SubCategory 1
- SubCategory 2
Category 2
- Subcategory 3
- SubCategory 4
Category 3
Category 4

そこで私のアプローチは、CategoryRepository から関数を返すエンティティ フィールドを作成することでした。このような:

$builder->add('category', 'entity', array(
                'class' => "AcmeAppBundle:Category",
                "property" => "Name",
                 'query_builder' => function (\path\to\CategoryRepository $repository)
                 {
                     return $repository->getOrderedCategories();
                 }
                )  

また、リポジトリには以下が含まれます。

class CategoryRepository extends EntityRepository
{
 public function getCategories()
{
    return $this->getEntityManager()
        ->createQuery('SELECT u FROM AcmeAppBundle:Category u WHERE u.parent is NULL ORDER BY u.priority DESC')
        ->getResult();
}

public function getOrderedCategories()
{
   //get the Parent-"Nodes"
   $entity = $this->getCategories();
   $arr = array();

    foreach ($entity as $cat) {  

        $arr[]=$cat;  

        foreach ($cat->getChildren() as $child)
        { 
           $arr[] = $child;
        }
    }
}  

私の現在のエラーメッセージは次のとおりです。

Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given   

これは良いアプローチですか?より良いものはありますか?

編集:
リクエストに応じて: カテゴリ エンティティ

/**
* Category
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Acme\AppBundle\Entity\CategoryRepository")
*/
class Category
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="Name", type="string", length=255)
 */
private $name;

/**
 * @var integer
 *
 * @ORM\Column(name="Priority", type="integer", nullable=true)
 * 
 */
private $priority;

/**
 * @ORM\OneToMany(targetEntity="Phrase", mappedBy="category")
 */
protected $phrases;

/**
 * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
 **/
protected $children;

/**
 * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
 * @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
 **/
protected $parent;

public function __construct() {
    $this->children = new ArrayCollection();
}

public function getChildren()
{
    return $this->children;
}

public function getParent()
{
    return $this->parent;
}

public function setParent($parent)
{
    if($parent -> getParent() == NULL)
    {
            $this->parent = $parent;
    }  
}

 public function getPhrases()
{
    return $this->phrases;
}
...some Setters&Getters  
4

1 に答える 1

2

エンティティ フィールド タイプの 'query_builder' オプションは、$queryBuilder->getQuery()->getResult() の代わりにQueryBuilder インスタンスを返す必要があります。(あなたの場合は配列です)

'query_builder' => function (\path\to\CategoryRepository $repository)
{
    return $repository->createQueryBuilder('category')
        ->where('category.parent is null')
        ->leftJoin('category.children', 'child', 'WITH', 'child.parent = category')
        ->orderBy('category.priority', 'DESC');
 }

カテゴリにツリー構造を実装しようとしていますか? Gedmo's Tree拡張機能を試してみてください :)

于 2013-05-26T19:39:23.217 に答える