【发布时间】:2012-07-15 18:29:04
【问题描述】:
一个 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 属性转换为字符串,从而导致错误:
可捕获的致命错误:类的对象 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()才能在应用程序的其他地方显示字符串。从
website属性中删除@ORM\Column注释;这将导致所有未来由差异生成的迁移(php app/console 原则:迁移:差异)删除相关数据库字段的“非空”方面。
我是否应该对上述注释进行任何更改,以通知 Symfony/Doctrine 调用 WebSite 的 getId() 方法以获取持久化时所需的内容?我可以对WebSite 进行任何更改以达到同样的效果吗?
需要进行哪些更改才能确保上述注释可以保留在原地,以便 Doctrine 最终调用 WebSite.getId() 以在持久化时获得所需的内容,而不是尝试将对象强制转换为字符串?
【问题讨论】:
标签: annotations doctrine-orm symfony-2.1