2013-05-26 37 views
0

我在創建自定義字段類型時遇到了一些問題。Symfony2:(子)類別自定義字段類型

我所擁有的是一個實體:

Category 
Id | Name | parent_id  

而我想要的到底是選場,看起來像這樣:

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 
+0

請檢閱我的答案,並詢問是否有任何不清楚/缺失,否則請接受:) – nifr

回答

2

在實體字段中鍵入 'query_builder' 選項有返回QueryBuilder的實例,而不是在$ queryBuilder-> getQuery() - >的getResult()。 (這是你的情況下的陣列)

'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的Tree延伸一槍:)

+0

首先,感謝您的快速答覆。雖然這不是我正在尋找的。第一個左連接不起作用 - 我只得到父實體(我用一個arraycollection映射了孩子 - 這可能是問題嗎?)第二:我想按照上面描述的格式來選擇格式,但我不能這麼做一個查詢,我可以嗎?我會嘗試TreeExtension。謝謝,尼夫! – Stilmittel

+0

可否請您提供您的類別實體類 - 如果沒有它不能幫助您或建議更好的實施。如果我的回答對你有幫助,請接受或者至少對它表示滿意;) – nifr

+0

我非常感謝你的幫助,我向你保證,只要我有代表這樣做,你就會得到你的讚賞;)我根本不想要已經接受了答案。也許還有其他答案。類別實體現在是問題的最後。 – Stilmittel

相關問題