Symfony / Doctrine:“可捕获的致命错误:当持久化</type>时,类<type>的对象无法转换为字符串”

时间:2012-07-16 20:45:45

标签: annotations doctrine-orm symfony-2.1

symfony2应用程序有一个Job实体,其属性类型为WebSite

没有其他属性或方法的简化表示:

/**
 * @ORM\Entity
 * @ORM\Table(name="Job")
 */
class Job
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;


    /**
     * @ORM\Column(type="integer", name="website_id", nullable=false)
     * @ORM\ManyToOne(targetEntity="Example\ExampleBundle\Entity\WebSite")
     */
    protected $website;
}

Symfony / Doctrine试图在持久化时将website属性转换为字符串,从而导致错误:

  

Catchable Fatal Error:类的对象   示例\ ExampleBundle \ Entity \ WebSite无法转换为字符串   在/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php第131行

我相信上面的@ORM \ Column注释表示website属性是一个整数。我不明白为什么Symfony / Doctrine希望尝试将website属性转换为字符串。

我试图解决问题的非理想解决方法:

  • __toString()方法添加到WebSite,返回id属性的字符串表示形式,导致正确的值最终以Job.website_id数据字段结尾;这种解决方法是不切实际的,因为将来需要__toString()可以在应用程序的其他地方显示字符串。

  • @ORM\Column属性中删除website注释;这将导致所有未来差异生成的迁移(php app / console doctrine:migrations:diff)删除相关数据库字段的“not null”方面。

我是否应对上述注释做出任何更改,以通知Symfony / Doctrine调用getId() WebSite方法来获取持久存在时所需的内容?我可以对WebSite做出任何改变吗?

需要进行哪些更改才能确保上述注释保持不变,以便Doctrine最终调用WebSite.getId()来获取持久存在时所需的内容,而不是尝试将对象强制转换为字符串?

1 个答案:

答案 0 :(得分:6)

您必须从@ORM\Column(type="integer"属性中删除$website注释。

为确保website_id列保留NOT NULL约束,请在其中添加JoinColumn注释nullable=false

/**
 * @var Example\ExampleBundle\Entity\WebSite
 * 
 * @ORM\ManyToOne(targetEntity="Example\ExampleBundle\Entity\WebSite")
 * @ORM\JoinColumn(name="website_id", referencedColumnName="id", nullable=false)
 */
protected $website;