duanhui4160 2011-10-31 20:04
浏览 66
已采纳

symfony2实体字段类型错误

I haven't found any solid example on how to do this.

I have my entity Shield, which can have more than 1 ShieldTypes. What I want to do is, create a form that creates a new Shield with different Shieldtypes.

This is my code, I honestly don't know where is my error:

Error is:

Entities passed to the choice field must be managed
500 Internal Server Error - FormException 

Armory\SearchBundle\Entity\Shield.php

namespace Armory\SearchBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
 * Armory\SearchBundle\Entity\Shield
 *
 * @ORM\Table(name="shield")
 * @ORM\Entity
 */
class Shield
{
    /**
     * @var integer $id
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;
    /**
     * @var string $name
     * @ORM\Column(name="name", type="string", length=45, nullable=false)
     */
    private $name;
    /**
     * @var integer $defense
     * @ORM\Column(name="defense", type="integer", nullable=false)
     */
    private $defense;

    /**
     * @var boolean $active
     * @ORM\Column(name="active", type="boolean", nullable=false)
     */
    private $active;

    /**
     * @ORM\ManyToMany(targetEntity="ShieldTypes")
     * @ORM\JoinTable(name="i_orbs_type",
     *     joinColumns={@ORM\JoinColumn(name="id_orb", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="id_type", referencedColumnName="id")}
     * )
     * @var ArrayCollection $types
     */
    protected $types;
    public function __construct(){
        $this->types = new \Doctrine\Common\Collections\ArrayCollection();
    }
    public function getTypes(){
        return $this->types;
    }
    public function getId()
    {
        return $this->id;
    }
    public function setName($name)
    {
        $this->name = $name;
    }
    public function getName()
    {
        return $this->name;
    }
    public function setDefense($defense)
    {
        $this->defense = $defense;
    }
    public function getDefense()
    {
        return $this->defense;
    }
    public function setActive($active)
    {
        $this->active = $active;
    }
    public function getActive()
    {
        return (bool)$this->active;
    }
}

Armory\SearchBundle\Form\ShieldType.php:

namespace Armory\SearchBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class ShieldType extends AbstractType{

public function buildForm(FormBuilder $builder, array $options){
    $builder->add('name','text');
    $builder->add('defense','integer');
    $builder->add('active','checkbox');

    $builder->add('types','entity',
            array(
                'class'=>'Armory\SearchBundle\Entity\ShieldTypes', 
                'query_builder'=> function($repository){ 
                            return $repository->createQueryBuilder('t')->orderBy('t.id', 'ASC');
                    },
                'property'=>'name', )
            );
}

public function getName(){
    return 'shield';
}

public function getDefaultOptions(array $options){
    return array('data_class'=>'Armory\\SearchBundle\\Entity\\Shield');
}
}

Armory\SearchBundle\Entity\ShieldTypes.php

namespace Armory\SearchBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
 * SOA\CRMBundle\Entity\ShieldTypes
 *
 * @ORM\Table(name="orbs_type")
 * @ORM\Entity
 */
class ShieldTypes
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;
    /**
     * @var string $name
     *
     * @ORM\Column(name="name", type="string", length=45, nullable=false)
     */
    private $name;
    /**
     * @var string $title
     *
     * @ORM\Column(name="title", type="string", length=45, nullable=false)
     */
    private $title;
    public function getId()
    {
        return $this->id;
    }
    public function setName($name)
    {
        $this->name = $name;
    }
    public function getName()
    {
        return $this->name;
    }
    public function setTitle($title)
    {
        $this->title = $title;
    }
    public function getTitle()
    {
        return $this->title;
    }   
}

It can be a little confusing but:

Shield entity (database)
ShieldTypes entity (database)
ShieldType form (abstracttype)

Thank you...

  • 写回答

1条回答 默认 最新

  • dse55384 2011-11-01 16:05
    关注

    So the problem was that I didn't create a repository. I created it (see code at the end) and I still got 'Entities passed to the choice field must be managed' error.

    Then I set mutiple to true in:

    $builder->add('types','entity',
                    array(
                        'class'=>'Armory\SearchBundle\Entity\ShieldTypes', 
                        'query_builder'=> function(\Armory\SearchBundle\Entity\Repository\ShieldTypesRepository $repository){ 
                                        return $repository->createQueryBuilder('s')->orderBy('s.id', 'ASC');},
                        'property'=>'title', 
                        'multiple'=>true
                        )
                    );
    

    I hope someone finds this useful, cause if I had had this, it would been easier.

    Code for my repository:

    namespace Armory\SearchBundle\Entity\Repository;
    use Doctrine\ORM\EntityRepository;
    
    class ShieldTypesRepository extends EntityRepository
    {
        public function getAll()
        {
            return $this->_em->createQuery('SELECT s FROM Armory\SearchBundle\Entity\ShieldTypes s')
                             ->getResult();
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog