我在創建自定義字段類型時遇到了一些問題。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
請檢閱我的答案,並詢問是否有任何不清楚/缺失,否則請接受:) – nifr