2012-07-16 63 views
0

symfony2应用程序具有Job实体,该实体具有WebSite类型的属性。Symfony/Doctrine:“可捕捉的致命错误:类<type>的对象无法转换为字符串”当持续时

这方面的一个简化表示没有其它的属性或方法:

/** 
* @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 /学说试图持续导致错误时将website属性转换为字符串:

Catchable Fatal Error: Object of class Example\ExampleBundle\Entity\WebSite could not be converted to string in /vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php line 131

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

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

  • 添加__toString()方法WebSite,返回id属性的字符串表示形式,使正确的价值最终落得数据字段为Job.website_id;这种解决方法是不切实际的,因为我将来需要__toString()可用于在应用程序中的其他位置呈现字符串。

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

是否有任何改变,我应该做出上述注释通知的Symfony /学说调用WebSitegetId()方法得到它所坚持的时候需要?我可以对WebSite做出任何更改以实现相同效果吗?

需要进行哪些更改才能确保上述注释能够保持原样,从而使Doctrine最终可以在持续时调用WebSite.getId()来获得所需内容而不是将对象转换为字符串?

回答

6

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

可以肯定的是,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; 
+0

请注意,你必须从你的注释取出完整@ORM \ Column属性! – nepda 2014-06-25 09:29:50

相关问题