2016-07-14 3 views
0

私が直面している問題は、私が強制することができないということです。doctrineは新しいオブジェクトの新しいIDを発行します。例えば:Doctrine:idsを一意に保つにはどうすればいいですか?

/** 
* Something 
* 
* @ORM\Table(name="something") 
* @ORM\Entity 
*/ 
class Something 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    protected $id; 
} 

は明らかに固有のIDを生成する - しかし、オブジェクトが後に削除される場合、そのIDは、後で生成されたオブジェクトのために使用されるであろう。不幸なことに、このIDを参照するリンクの周りにリンクが存在する可能性があります。このIDは、単に失敗するのではなく間違ったオブジェクトを指しています。

のdoctrineをデータベースに直接接続しないで作業している場合、私はautoincrementを使用していて、期待どおりに動作していました。ただし、のdoctrineを使用してテーブルを管理すると、これはうまくいかないようです。

strategy="UUID"を使用すると便利ですが、しばしばより良い選択ですが、時にはこれが実現できません。たとえば、バンドルFOSUserBundleは、ユーザーのIDの整数に依存しているようです。これは、基本的には、a)ユーザーを決して削除せず、単に非アクティブにすること、またはb)別のid/keyを追加することです。

新しい整数IDを強制できますか?しかし、本番サーバー - 現在、OS X上でのsymfony 3.1.2内のsqliteと教義2.5.4を使用して

(。代わりにいいだろうが、私はそれが到達してないと思うFOSBundle使用UUIDを作るための方法) Linuxベースです。 PHP 7.0で動作します。

答えて

1

DoctrineはDoctrine documentationに基づいてGeneratedValue(strategy="IDENTITY")AUTOINCREMENTをsqliteデータベースにマップする必要があります。したがって、Doctrineなしで試してみることに違いはありません。

実際には、AUTOINCREMENTのID列は、それを生成したトランザクションがロールバックされた場合にのみ生成された数値を再利用する必要があります(https://sqlite.org/autoinc.html参照)。そのような場合、番号はロールバックする必要があるため、他のエントリで使用しないでください。

少なくともトランザクションを使用している場合はGeneratedValue(strategy="IDENTITY")を使用しても問題はありません。

EDIT

が正しく動作からGeneratedValue(strategy="IDENTITY")を防ぐbug in Doctrine2がありますが、a workaroundonSchemaCreateTableイベントのEventSubscriberを登録している、存在しています。これは、プライマリキー列にAUTOINCREMENT属性を持つテーブルを生成するための正しいsqlを作成します。

+0

これは私が思ったことです。ただ追加されません。私はおそらく、手動でテーブルを変更することができますが、後でdoctrine:schema:updateを実行した後、ある時点で再び破棄されます。 :/ – Eiko

+0

私はちょうどdoctrine2のコード、特に/vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/SqlitePlatform.phpを見てきました。本当に 'strategy =" IDENTITY "'は何もしませんDoctrineのドキュメントとは対照的に、sqliteの 'AUTOINCREMENT'機能の使用は... sqliteのバグのようです。 –

+0

GitHubには既に問題があります:https://github.com/doctrine/dbal/issues/2426 –

関連する問題