2013-05-27 4 views
7

Podczas próby usunięcia obiektu zawierającego jednokierunkowe powiązania jeden-do-wielu uzyskuję obce naruszenie. Mam następującą prostą klasę:Doctrine2 - Nie można usunąć obiektu z jednokierunkową relacją OneToany

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; 
} 

Przedmiotem Car nie powinien zawierać stosunku do jego właściciela, w tym przypadku (stąd relacja jednokierunkowa). Gdy próbuję usunąć Dealer obiekt zawierający stowarzyszenia do samochodów, pojawia się następujący wiązania naruszenie:

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`))' 

by uzyskać ten sam komunikat, jeśli próbowałem ręcznie usunąć wiersz sprzedawcy z tabeli bazy danych, ale myślałem, Doctrine, używając cascade = "remove", zajmie się tym dla mnie.

Jeśli zmienię powiązanie na połączenie dwukierunkowe, działa. Dlaczego nie działa to w przypadku skojarzeń jednokierunkowych?

+0

jednokierunkowa jeden-do-wielu stowarzyszenia? wygląda to bardziej jak dwukierunkowe wiele do wielu: D Czy porzuciłeś bazę danych i odtworzyłeś lub czy w bazie danych zmieniłeś schemat, czy też masz jakieś resztki urządzeń/danych? – nifr

+0

chcesz usunąć dealera bez utraty samochodu, czy mam to prawo? – nifr

+1

Jest to definicja Doktryny jednokierunkowej jeden do wielu. Jest to wiele-do-wielu z unikalnym ograniczeniem. Chcę usunąć samochód, gdy dealer również zostanie usunięty. –

Odpowiedz

13

Użyj opcji onDelete poziomie bazy danych z doktryną

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

wyjaśnień od here:

  • CASCADE będzie rozprzestrzeniać się zmieniały, gdy zmieni rodzica. (Jeśli usuniesz wiersz, wiersze w ograniczonych tabelach, które odwołują się do tego wiersza, zostaną również usunięte itd.)
  • SET NULL ustawia wartość kolumny na NULL, gdy wiersz rodzica zniknie.

  • Opcja RESTRICT powoduje, że próba usunięcia wiersza nadrzędnego zakończy się niepowodzeniem.


... aktualizacja schematu bazy danych przed sędzią nie działa :-)

app/console doctrine:schema:update --force 

jeśli ten nie działa ze względu na zagranicznych kluczowych błędów przejść ciężką drogę (w tej kolejności):

  • app/console doctrine: bazy danych: drop
  • app/console doctrine: baza danych: tworzenie
  • app/doktrynę konsoli: schema: update --force
  • (opcjonalnie: app/doctrine konsola: Oprawy: obciążenie)
+0

tak, to było to. Sądzę, że "SET NULL" zadziałałby równie dobrze jak "kaskada". –

+1

+1 za to i ważne, aby pamiętać o odzyskaniu schematu! :) –