sql >> Database >  >> RDS >> Mysql

Beperking van buitenlandse sleutels in de Doctrine uitschakelen

Per definitie je kunt het record waarnaar de refererende sleutel verwijst niet verwijderen zonder de sleutel op null te zetten (onDelete="SET NULL" ) of trapsgewijs de verwijderbewerking uitvoeren (Er zijn twee opties - ORM-niveau:cascade={"remove"} | databaseniveau:onDelete="CASCADE" ).
Er is het alternatief van een standaardwaarde instellen van een nog steeds bestaand record , maar je moet dat handmatig doen, ik denk niet dat Doctrine dit "out-of-the-box" ondersteunt (corrigeer me als ik het mis heb, maar in dit geval is het instellen van een standaardwaarde sowieso niet gewenst).

Deze striktheid weerspiegelt het concept van externe sleutelbeperkingen; zoals @Théo zei:

Soft delete (reeds genoemd) is een oplossing, maar wat je ook zou kunnen doen is een extra removed_page_id toevoegen kolom die u synchroniseert met de page_id net voordat je het verwijdert in een preRemove event handler (levenscyclus callback). Of zulke informatie enige waarde heeft vraag ik me af, maar ik denk dat je er wat aan hebt, anders zou je deze vraag niet stellen.

Ik beweer zeker niet dat dit een goede gewoonte is , maar het is in ieder geval iets dat je kunt gebruiken voor je edge-case. Dus iets in de trant van:

In uw 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;

En dan in je 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();
}

Als alternatief kunt u natuurlijk al de juiste $removedPageId . instellen waarde tijdens de constructie van uw Revision , dan hoeft u niet eens een life cycle callback uit te voeren bij het verwijderen.



  1. Hoe verander je de tijdsduur?

  2. Provider genaamd pijpen provider fout 40 kan geen verbinding maken met SQL Server fout 2

  3. Hoe de maand te krijgen met behulp van de datum in MySQL

  4. mysql | Codeigniter Active Records voegt extra back-ticks toe aan query