2017-03-02 2 views
0

Ich habe eine Elternteil und Kind Entitäten, Eltern ein Bild zu sein, und Kind eine Stimme für das BildWarum funktioniert meine Kaskade nicht? - Integrität Einschränkungsverletzung

class Image { 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 
    /** 
    * @ORM\Column(type="string", length=255, name="file_name") 
    * @var string $fileName 
    */ 
    protected $fileName; 

    /** 
    * @ORM\Column(type="string", length=255, name="title", nullable=true) 
    * @var string $title 
    */ 
    protected $title = null; 

    /** 
    * @ORM\Column(type="string", length=255, name="author", nullable=true) 
    * @var string $author 
    */ 
    protected $author = null; 

    /** 
    * @ORM\Column(type="datetime", name="upload_at") 
    */ 
    protected $uploadDate; 

    /** 
    * @ORM\Column(type="boolean", name="in_pool") 
    */ 
    protected $inPool; 

    /** 
    * One image has many votes 
    * @ORM\OneToMany(targetEntity="Vote", mappedBy="image") 
    */ 
    private $votes; 

Kind zu sein:

class Vote 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 
    /** 
    * @ORM\ManyToOne(targetEntity="Image", inversedBy="votes") 
    * @ORM\JoinColumn(onDelete="CASCADE") 
    */ 
    protected $image; 

    /** 
    * @ORM\Column(type="datetime", name="date") 
    */ 
    protected $date; 

    /** 
    * This is internal variable, it does not have to be mapped into database field 
    * @var int Counter of votes for an Image 
    */ 
    private $counter; 

Wie man sehen kann ich das habe @ORM\JoinColumn(onDelete="CASCADE") in der Entität festgelegt.

aber wenn ich versuche, ein Bild zu entfernen, die Stimmen ich diese bekommen hat:

Eine Ausnahme trat während der Ausführung von ‚DELETE FROM Bild WHERE id =‘ mit params [24]:

SQLSTATE [23000]: Integrität Verletzung Einschränkung: 1451 nicht oder Update eine übergeordnete Zeile löschen: a. Fremdschlüssel fehlschlägt (konkursvote, CONSTRAINT FK_5A1085643DA5256D FOREIGN KEY (image_id) LITERATUR image (id))

Der Code verwendet, um ein Bild auf id basierend löschen sieht wie folgt aus:

/** 
* @Route("/admin/removeimage/{id}", name="admin-remove-image") 
*/ 
public function adminRemoveImage($id) 
{ 

    $em = $this->getEm(); 
    $image = $em->getRepository('AppBundle:Image')->findOneById($id); 
    $fileName = $image->getFileName(); 

    $em->remove($image); 
    $em->flush(); 

    unlink('uploads/'.$fileName); 
    unlink('media/cache/my_thumb/uploads/'.$fileName); 

    return $this->redirectToRoute('admin-panel'); 
} 

Könnte mir jemand sagen, warum diese Beziehung weiterhin versagt?

UPDATE ist die Ausgabe von SHOW CREATE TABLE vote mit

| Abstimmung | CREATE TABLE vote (id int (11) NOT NULL AUTO_INCREMENT, date DATETIME NOT NULL, image_id int (11) DEFAULT NULL, PRIMARY KEY (id), Schlüssel IDX_5A1085643DA5256D (image_id), Constraint FK_5A1085643DA5256D FOREIGN KEY (image_id) LITERATUR image (id)) ENGINE = InnoDB AUTO_INCREMENT = 14 DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci |

+0

Was die Ausgabe von SQL ist: SHOW CREATE TABLE vote' oder Konsole: 'PHP-bin/Konsole Lehre: schema: update --dump-sql'? – fyrye

+1

Sehen Sie sich an, wie Kaskadenoperationen mit Doctrine definiert werden: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html#transitive-persistence-cascade -Operationen – Cerad

+0

@fyrye Aktualisierte die Frage – aln447

Antwort

1

@ORM\JoinColumn(onDelete="CASCADE") Hinzufügen ist eine Abbildung für die Tabellen, die Lehre über doctrine:schema:update oder doctrine:schema:create verwaltet.

Der Kaskaden-Fremdschlüsselverweis wird nicht automatisch auf die Datenbanktabellenspalte angewendet, sofern die obigen Befehle nicht ausgegeben werden.

Standardmäßig wird beim Erstellen einer Fremdschlüsselreferenz auf ON DELETE RESTRICT festgelegt.

Um Ihr Problem die folgenden SQL-Befehle zu beheben:

ALTER TABLE `vote` DROP FOREIGN KEY `FK_5A1085643DA5256D`; 

ALTER TABLE `vote` ADD CONSTRAINT `FK_5A1085643DA5256D` FOREIGN KEY (`image_id`) REFERENCES `image` (`id`) ON DELETE CASCADE; 

die die gleichen wie Laufen sein:

php bin/console doctrine:schema:update --force 

jedoch das Schema Update irreversible Änderungen/Schäden an der Datenbankstruktur führen kann .

See: http://symfony.com/doc/current/doctrine.html#creating-the-database-tables-schema

Ich schlage vor, auch php bin/console doctrine:schema:update --dump-sql läuft von anderen potenziellen Fehlkonfigurationen zu bestimmen, die Zuordnungen Lehre Entität bearbeiten.


Alternativ wie @Cerad erwähnt, können Sie Lehre sagen, die Beziehungen zu verwalten, ohne auf Fremdschlüssel-Referenzen unter Berufung durch cascade={"remove"} wie so verwenden.

class Image 
{ 
    //... 

    /** 
    * One image has many votes 
    * @ORM\OneToMany(targetEntity="Vote", mappedBy="image", cascade={"remove"}) 
    */ 
    private $votes; 
} 

Dies wird symfony erzählen eine DELETE-Anweisung für die Vote Einheit Sammlung mit dem Image Entität zugeordnet zu erteilen, wenn die Image Einheit entfernt wird.

Eine Einschränkung besteht darin, dass dies nur funktioniert, wenn Befehle für den Entity Manager und nicht für den DBAL Query Builder ausgegeben werden.

Referenz: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#removing-entities

+0

Beide "--dump-sql" und "--force" führen zu der gleichen Antwort: ** Nichts zu aktualisieren - Ihre Datenbank ist bereits mit den aktuellen Entitätsmetadaten synchronisiert. ** – aln447

+0

Stellen Sie sicher, dass Sie 'php bin/console cache: clear 'vor dem Schema ausführen, damit die Konfiguration neu generiert wird. Die SQL-Anweisung wird das Problem unabhängig beheben. Seien Sie gewarnt, wenn Sie "--force" ausführen, kann dies zu Datenverlust führen. Möglicherweise müssen Sie auch 'php bin/console doctrine: cache: clear-metadata' ausführen. – fyrye

+0

Gleiches Ergebnis. Das Hinzufügen von 'cascade = {" remove "}' in das Bild löste das Problem. Vielen Dank – aln447

Verwandte Themen