一个 symfony2 应用程序有一个Job
实体,该实体具有 type 的属性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
属性转换为字符串,从而导致错误:
可捕获的致命错误:无法将类 Example\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 dictionary:migrations:diff)删除相关数据库字段的“非空”方面。
我应该对上述注释进行任何更改以通知 Symfony/Doctrine 调用getId()
方法WebSite
以获取持久化时所需的内容吗?我可以做些什么改变WebSite
来达到同样的效果吗?
需要进行哪些更改才能确保上述注释可以保留在原地,以便 DoctrineWebSite.getId()
在持久化时最终调用以获取所需的内容,而不是尝试将对象强制转换为字符串?