doctrine:mapping:convert コマンドを使用して、Doctrine 1 を使用して構築された既存の mysql データベースからスキーマをリバース エンジニアリングしました。元のデータベースには、次のような整数キー フィールドがあります。
`client_id` int(10) unsigned default NULL,
KEY `FK_activity_client` (`client_id`),
と
`client_id` int(10) unsigned NOT NULL auto_increment,
エンティティを作成した後、次のようなコードを取得しました。
/**
* @var \Client
*
* @ORM\ManyToOne(targetEntity="Client")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="client_id", referencedColumnName="client_id")
* })
*/
private $client;
と
/**
* @var integer
*
* @ORM\Column(name="client_id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $clientId;
これまでのところ、私が期待していた通りでした。次に、関連のない別のエンティティに小さな変更を加え、doctrine:schema:update を実行しようとしました。次のようなフィールドに変更を加えました。
ALTER TABLE activity CHANGE client_id client_id INT DEFAULT NULL, ...
と
ALTER TABLE activity ADD CONSTRAINT FK_AC74095A8DB60186 FOREIGN KEY (client_id) REFERENCES client (client_id);
DROP INDEX UN_client ON client;
ALTER TABLE client CHANGE client_id client_id INT AUTO_INCREMENT NOT NULL, ...
これにより、アクティビティ client_id が unsigned int(11) signed に変更され、unsigned int(10) への外部キーの作成が試行されます。
そして、古くからの友人であるエラー 1005 が表示されます。これは、MySQL の最もわかりやすいエラー メッセージです。
データベース内のフィールドをDoctrineが望むものに調整するか、次のようにして外部キーチェックをオフにすることができます:
SET foreign_key_checks = 0;
この場合、これらの回避策は問題ありません。私の質問は:
Doctrine にデータベースのフィールド サイズと属性を使用させ、それらをエンティティに記憶させ、必要のないときにいじらないようにする方法はありますか? これは、データベースが大規模で、それらの属性がどうあるべきかについて独自の要件を持つ他のアプリケーションと共有されている場合に重要になる可能性があります。