【问题标题】:Symfony/Doctrine: "Catchable Fatal Error: Object of class <type> could not be converted to string" when persistingSymfony/Doctrine:“可捕获的致命错误:类 <type> 的对象无法转换为字符串”
【发布时间】: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 调用 WebSitegetId() 方法以获取持久化时所需的内容?我可以对WebSite 进行任何更改以达到同样的效果吗?

需要进行哪些更改才能确保上述注释可以保留在原地,以便 Doctrine 最终调用 WebSite.getId() 以在持久化时获得所需的内容,而不是尝试将对象强制转换为字符串?

【问题讨论】:

    标签: annotations doctrine-orm symfony-2.1


    【解决方案1】:

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

    为确保 website_id 列保持 NOT NULL 约束,请添加带有 nullable=falseJoinColumn 注释:

    /**
     * @var Example\ExampleBundle\Entity\WebSite
     * 
     * @ORM\ManyToOne(targetEntity="Example\ExampleBundle\Entity\WebSite")
     * @ORM\JoinColumn(name="website_id", referencedColumnName="id", nullable=false)
     */
    protected $website;
    

    【讨论】:

    • 请注意,您必须从注释中删除完整的 @ORM\Column 属性!
    猜你喜欢
    • 2016-01-18
    • 2015-03-08
    • 2013-08-07
    • 2018-03-12
    • 2014-02-21
    • 1970-01-01
    • 2015-11-21
    • 2014-06-21
    相关资源
    最近更新 更多