11

レガシー PHP アプリケーションを Symfony 2 に変換中です。現時点では、アプリケーション データの一貫性があまりないため、外部キー制約の作成を避けたいと考えています。「製品」エンティティ クラスに次の注釈があります。

class Product {

  // some definitions

  /**
   * @ORM\ManyToOne(targetEntity="Manufacturer")
   * @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id" )
   */
  private $Manufacturer;
}

するとapp/console doctrine:schema:update、SQLコマンドを取得します

 ALTER TABLE products ADD CONSTRAINT FK_F6FA18741C3BF575 
   FOREIGN KEY (manufacturer_id) REFERENCES manufacturer(id);

どうすればこれを回避できますか?

4

6 に答える 6

13

私は最近同じプロセスを経なければなりませんでしたが、幸いにも簡単な解決策がありnullable=trueます。列の注釈に追加するだけです。

これは、既存のデータが有効である限り機能します。私の場合、0 を NULL に変更し、存在しなくなったキーを NULL に変更する必要がありました。

于 2013-06-06T14:02:28.683 に答える
8

基本的に、SQLコマンドの生成を防ぐことはできません。少なくとも、Doctrineコードに飛び込むことなくしてはいけません。

ただし、データベースに実際に制約を適用する必要はありません。D2は、それらがなくても問題なく動作します。

于 2012-04-08T15:12:01.513 に答える
0

失われた外部キーを null に設定する必要があります。その後、制約を設定できます。次のクエリは、変更するデータセットの ID を提供します。

select p.id from product p
left join manufacturer m on m.id=p.manufakturer_id
where m.id is null
于 2016-11-09T08:07:51.257 に答える
0

ManyToMany と JoinColumn の定義を省略し、自動生成された製品リポジトリを拡張する public getManufacturer メソッドを使用してカスタム製品リポジトリの Manufacturer プロパティを処理する必要があります。

于 2012-06-12T12:41:23.827 に答える
-2

onDelete="CASCADE" のように追加してみてください

* @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id", onDelete="CASCADE")
于 2014-05-31T08:05:21.580 に答える