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()
来获取持久存在时所需的内容,而不是尝试将对象强制转换为字符串?
答案 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;