0

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プロパティが整数であることを示していると思います。websiteSymfony/Doctrineがプロパティを文字列に変換しようとする理由がわかりません。

問題を解決するために私が試した非理想的な回避策:

  • __toString()にメソッドを追加しWebSite、プロパティの文字列表現を返すidと、正しい値が最終的にデータフィールドに格納されJob.website_idます。この回避策は実用的ではありません。将来__toString()、アプリケーションの他の場所で文字列を表示できるようにする必要があるからです。

  • プロパティ@ORM\Columnから注釈を削除します。websiteこれにより、将来のすべてのdiff生成移行(php app / console doctrine:migrations:diff)で、関連するデータベースフィールドの「notnull」の側面が削除されます。

永続化するときに必要なものを取得するためのgetId()メソッドを呼び出すようにSymfony/Doctrineに通知するために、上記のアノテーションに変更を加える必要がありますか?同じことを達成するためWebSiteに私が行うことができる変更はありますか?WebSite

WebSite.getId()Doctrineがオブジェクトを文字列にキャストしようとするのではなく、永続化するときに必要なものを取得するために最終的に呼び出すように、上記の注釈をそのまま維持できるようにするには、どのような変更が必要ですか?

4

1 に答える 1

6

@ORM\Column(type="integer"プロパティから注釈を削除する必要があり$websiteます。

website_id 列が制約を保持していることを確認するには、その中に注釈をNOT NULL追加します。JoinColumnnullable=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 に答える