0

一个 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()在持久化时最终调用以获取所需的内容,而不是尝试将对象强制转换为字符串?

4

1 回答 1

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;
于 2012-07-16T22:12:31.303 回答