sql >> Database teknologi >  >> RDS >> Mysql

Deaktiver Doctrine-fremmednøglebegrænsning

Efter definition du kan ikke slette posten, som fremmednøglen peger på uden at sætte nøglen til null (onDelete="SET NULL" ) eller kaskade af slettehandlingen (Der er to muligheder - ORM-niveau:cascade={"remove"} | databaseniveau:onDelete="CASCADE" ).
Der er alternativet indstilling af en standardværdi for en stadig eksisterende post , men du skal gøre det manuelt, jeg tror ikke, at Doctrine understøtter denne "out-of-the-box" (ret mig venligst, hvis jeg tager fejl, men i dette tilfælde er det alligevel ikke ønskeligt at indstille en standardværdi).

Denne strenghed afspejler konceptet med at have fremmednøglebegrænsninger; som @Théo sagde:

Blød sletning (allerede nævnt) er en løsning, men hvad du også kan gøre er at tilføje en ekstra removed_page_id kolonne, som du synkroniserer med page_id lige før du sletter det i en preRemove hændelseshåndtering (livscyklustilbagekald). Jeg spekulerer på, om sådanne oplysninger har nogen værdi, men jeg gætter på, at du har brug for det, ellers ville du ikke stille dette spørgsmål.

Jeg påstår bestemt ikke, at dette er god praksis , men det er i hvert fald noget, du kan bruge til din kantkasse. Så noget i retning af:

I din Revision :

/**
 * @ORM\ManyToOne(targetEntity="Page", cascade="persist")
 * @ORM\JoinColumn(name="page_id", referencedColumnName="id", onDelete="SET NULL")
 */
private $parentPage;

/**
 * @var int
 * @ORM\Column(type="integer", name="removed_page_id", nullable=true)
 */
protected $removedPageId;

Og derefter på din Page :

/** 
 * @ORM\PreRemove 
 */
public function preRemovePageHandler(LifecycleEventArgs $args)
{
    $entityManager = $args->getEntityManager();
    $page = $args->getEntity();
    $revisions = $page->getRevisions();
    foreach($revisions as $revision){
        $revision->setRemovedPageId($page->getId());
        $entityManager->persist($revision);
    }
    $entityManager->flush();
}

Alternativt kan du selvfølgelig allerede indstille den korrekte $removedPageId værdi under opbygningen af ​​din Revision , så behøver du ikke engang at udføre et livscyklustilbagekald ved fjernelse.



  1. Bigquery:søg i flere tabeller og aggregér med først_set og sidst_set

  2. 2-bords interaktion:indsæt, få resultat, indsæt

  3. standard en kolonne med tom streng

  4. VS 2019 og MySQL Entity Framework duplikatdatabasenavn