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
プロパティが整数であることを示していると思います。website
Symfony/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がオブジェクトを文字列にキャストしようとするのではなく、永続化するときに必要なものを取得するために最終的に呼び出すように、上記の注釈をそのまま維持できるようにするには、どのような変更が必要ですか?