可捕获的致命错误:类的对象无法转换为字符串

时间:2013-08-06 18:51:33

标签: symfony symfony-forms symfony-2.3

我已定义此实体:

namespace CategoryBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;

/**
 * @ORM\Entity
 * @ORM\Table(name="category")
 */
class Category {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * 
     */
    protected $id;

    /**
     *
     * @ORM\Column(type="string", length=255, nullable=false)
     */
    protected $name;

    /**
     *
     * @ORM\Column(type="integer", nullable=true)
     */
    protected $parent;

    /**
     *
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    protected $description;

    /**
     *
     * @ORM\Column(type="integer")
     */
    protected $age_limit;

    /**
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(name="created", type="datetime")
     */
    protected $created;

    /**
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(name="modified", type="datetime")
     */
    protected $modified;

    public function getId() {
        return $this->id;
    }

    public function setParent(Category $parent = null) {
        $this->parent = $parent;
    }

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

    public function setName($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }

    public function setDescription($description) {
        $this->description = $description;
    }

    public function getDescription() {
        return $this->description;
    }

    public function setAgeLimit($age_limit) {
        $this->age_limit = $age_limit;
    }

    public function getAgeLimit() {
        return $this->age_limit;
    }

    public function setCreated($created) {
        $this->created = $created;
    }

    public function getCreated() {
        return $this->created;
    }

    public function setModified($modified) {
        $this->modified = $modified;
    }

    public function getModified() {
        return $this->modified;
    }
}

然后我在我的控制器中使用这个方法来提交句柄表单:

/**
 * Handle category creation
 *
 * @Route("/category/create", name="category_create")
 * @Method("POST")
 * @Template("CategoryBundle:Default:new.html.twig")
 */
public function createAction(Request $request) {
    $entity = new Category();
    $form = $this->createForm(new CategoryType(), $entity);
    $form->handleRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('category_list'));
    }

    return $this->render('CategoryBundle:Default:new.html.twig', array(
                'entity' => $entity,
                'form' => $form->createView(),
    ));
}

最后这是我的CategoryType.php

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
            ->add('parent', 'entity', array('class' => 'CategoryBundle:Category', 'property' => 'name', 'required' => false))
            ->add('name')
            ->add('description')
            ->add('age_limit');
}

当我尝试保存数据时,我收到此错误:

  

执行'INSERT INTO类别(名称,   parent,description,age_limit,created,modified)VALUES(?,?,?,?,   ?,?)'with params [“Cat2”,{},null,2,“2013-08-06 09:58:03”,   “2013-08-06 09:58:03”]:

     

Catchable Fatal Error:类CategoryBundle \ Entity \ Category的对象   无法转换为字符串   /var/www/html/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php   第138行

我做错了什么?如何在我的方法中访问该属性,以便保存该值?

更新

根据@sybio提出的建议,我改写了我的实体,所以现在我有了这个:

/**
 * @ManyToOne(targetEntity="Category")
 * @JoinColumn(name="parent", referencedColumnName="id")
 */
protected $parent;

是吗?

1 个答案:

答案 0 :(得分:4)

这就是我的想法:

您正尝试将Category对象保存为父对象,但在以下代码中:

/**
 *
 * @ORM\Column(type="integer", nullable=true)
 */
protected $parent;

你说父类是一个整数,所以框架试图将父类保存为一个整数但是它可能会将对象转换为字符串之前,因此它会崩溃......

我不完全确定,但你应该重新考虑你的财产“$ parent”。

它应该是self referencing relation

示例:

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

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

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

不要忘记重构你的getter / setter:

    /**
     * Set parent
     *
     * @param \CategoryBundle\Entity\Category $parent
     */
    public function setParent(\CategoryBundle\Entity\Category $parent = null)
    {
        $this->parent = $parent;
    }

    /**
     * Get parent
     *
     * @return \CategoryBundle\Entity\Category 
     */
    public function getParent()
    {
        return $this->parent;
    }

希望这是解决方案!