sql >> Databasteknik >  >> RDS >> Mysql

Inaktivera begränsning av främmande nyckel för Doctrine

Enligt definition du kan inte radera posten som den främmande nyckeln pekar på utan att ställa in nyckeln på null (onDelete="SET NULL" ) eller kaskad raderingsoperationen (Det finns två alternativ - ORM-nivå:cascade={"remove"} | databasnivå:onDelete="CASCADE" ).
Det finns alternativet ställer in ett standardvärde för en fortfarande existerande post , men du måste göra det manuellt, jag tror inte att Doctrine stöder detta "out-of-the-box" (rätta mig om jag har fel, men i det här fallet är det inte önskvärt att ställa in ett standardvärde ändå).

Denna strikthet återspeglar konceptet med att ha främmande nyckelbegränsningar; som @Théo sa:

Mjuk borttagning (som redan nämnts) är en lösning, men vad du också kan göra är att lägga till ytterligare removed_page_id kolumn som du synkroniserar med page_id precis innan du tar bort den i en preRemove händelsehanterare (livscykelåteruppringning). Jag undrar om sådan information har något värde, men jag antar att du har någon nytta av den, annars skulle du inte ställa den här frågan.

Jag påstår definitivt inte att detta är god praxis , men det är åtminstone något som du kan använda till ditt kantfodral. Så något i raden av:

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;

Och sedan 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 naturligtvis redan ställa in rätt $removedPageId värde under konstruktionen av din Revision , då behöver du inte ens utföra en livscykelåteruppringning vid borttagning.



  1. Vilken MySQL-datatyp som ska användas för att lagra booleska värden

  2. Begränsning av samtidiga användarsessioner för en specifik inloggning i SQL Server

  3. Hur man löser Dialect class not found:org.hibernate.dialect.MYSQLDialect Undantag?

  4. Hitta nästa månad för ett givet datum i mysql