8

一方向の 1 対多の関連付けを含むエンティティを削除しようとすると、外部制約違反が発生します。次の単純なクラスがあります。

class Dealer{

/**
 * @ManyToMany(targetEntity="Car", cascade={"persist", "remove"})
 * @JoinTable(name="dealer_cars",
 *      joinColumns={@JoinColumn(name="dealer_id", referencedColumnName="id")},
 *      inverseJoinColumns={@JoinColumn(name="car_id", referencedColumnName="id",
        unique=true)}
 *    )
 **/
  protected cars;
}

このCar場合、オブジェクトはその所有者との関係を含むべきではありません (したがって、一方向の関係)。車への関連付けを含むオブジェクトを削除しようとするとDealer、次の制約違反が発生します。

Cannot delete or update a parent row: a foreign key constraint fails 
(`application`.`dealer_cars`, CONSTRAINT `FK_E1BCEEEBC3C6F69F`
 FOREIGN KEY (`car_id`) REFERENCES `car` (`id`))'

データベース テーブルからディーラーの行を手動で削除しようとすると、同じメッセージが表示されますが、cascade="remove" を使用する Doctrine がこれを処理してくれると思いました。

関連付けを双方向の関連付けに変更すると、機能します。これが一方向の関連付けで機能しないのはなぜですか?

4

1 に答える 1

17

Doctrine でデータベース レベルの onDelete オプションを使用する

@ORM\JoinColumn(name="dealer_id", referencedColumnName="id",  onDelete="SET NULL")

ここからの説明:

  • 親が変更されると、CASCADE は変更を伝播します。(行を削除すると、その行を参照している制約付きテーブルの行も削除されます。)
  • SET NULL は、親行がなくなると列の値を NULL に設定します。

  • RESTRICT を指定すると、親行の DELETE の試行が失敗します。


...動作していないと文句を言う前に、データベーススキーマを更新してください:-)

app/console doctrine:schema:update --force

外部キーエラーが原因でこれが機能しない場合は、(この順序で)困難な道を進みます:

  • app/console doctrine:database:drop
  • アプリ/コンソールの教義:データベース:作成
  • app/console doctrine:schema:update --force
  • (オプション: app/console doctrine:fixtures:load )
于 2013-05-28T00:24:09.680 に答える