von Definition Sie können den Datensatz löschen, dass der Fremdschlüssel an zeigt, ohne den Schlüssel zu Null-Einstellung (onDelete="SET NULL"
) oder Kaskadierung des Löschvorganges (There are two options - ORM Level: cascade={"remove"}
| Datenbank-Ebene: onDelete="CASCADE"
).
Es gibt die Alternative setting a default value of a still existing record, aber Sie müssen das manuell tun, ich glaube nicht, dass Doctrine dies unterstützt out-of-the-box
(bitte korrigieren Sie mich, wenn ich falsch liege, aber in diesem Fall ist die Einstellung eines Standardwertes sowieso nicht erwünscht).
Diese Strenge spiegelt das Konzept von Fremdschlüsseleinschränkungen wider; wie @ Théo sagte:
a FK is to ensure data consistency.
Soft-delete (bereits erwähnt) ist eine Lösung, aber was Sie auch eine zusätzliche removed_page_id
Spalte tun können, ist hinzufügen, die Sie mit dem page_id
nur synchronisieren, bevor Sie es in einer preRemove
Event-Handler löschen (Lebenszyklus Rückruf). Ob solche Informationen irgendeinen Wert haben, frage ich mich, aber ich denke, Sie haben etwas dafür, sonst würden Sie diese Frage nicht stellen.
Ich bin auf jeden Fall nicht behaupten, das ist gute Praxis, aber es ist zumindest etwas, das Sie für Ihren Rand Fall verwenden können. So etwas in der Linie:
In Ihrem 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;
Und dann in Ihrem 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();
}
Alternativ können Sie natürlich bereits den richtigen $removedPageId
Wert während der Bauphase einstellen könnten Ihre Revision
, dann müssen Sie beim Entfernen nicht einmal einen Lebenszyklus-Callback ausführen.
Entschuldigung für die falsche enge Abstimmung, ich habe Ihre Frage falsch gelesen. Was Sie tun müssen, ist die tatsächliche Fremdschlüsseleinschränkung zu entfernen. Wenn die Einschränkung über Doctrine erstellt wurde, sollten Sie sie so konfigurieren, dass sie dies nicht mehr tut, oder Sie müssen sie einfach entfernen. – Phil
@Phil Doctine erzeugt das Schema jedoch, und ich weiß nicht, wie ich es sagen soll die Einschränkung nicht hinzufügen. – Petah
Eine Alternative könnte das Hinzufügen einer Eigenschaft (z. B. 'enabled') sein, die die Seite von Suchen ausschließt. Dies bewirkt, dass die Seite gelöscht wird, ohne dass eine Fremdschlüsseleinschränkung verletzt wird. – geoB