Mysql
 sql >> база данни >  >> RDS >> Mysql

Деактивирайте ограничаването на външния ключ на Doctrine

Подефиниция не можете да изтриете записа, към който сочи външният ключ, без да зададете ключа на null (onDelete="SET NULL" ) или каскадна операция за изтриване (Има две опции - Ниво на ORM:cascade={"remove"} | ниво на база данни:onDelete="CASCADE" ).
Има алтернатива на задаване на стойност по подразбиране на все още съществуващ запис , но трябва да направите това ръчно, не мисля, че Doctrine поддържа това „извън кутията“ (моля, поправете ме, ако греша, но в този случай настройката на стойност по подразбиране така или иначе не е желателна).

Тази строгост отразява концепцията за наличие на ограничения за външен ключ; както каза @Théo:

Мекото изтриване (вече споменато) е едно решение, но това, което бихте могли да направите, е да добавите допълнителен removed_page_id колона, която синхронизирате с page_id точно преди да го изтриете в preRemove манипулатор на събития (обратно извикване на жизнения цикъл). Чудя се дали подобна информация има някаква стойност, но предполагам, че имаш някаква полза от нея, в противен случай не бихте задали този въпрос.

Определено не твърдя, че това е добра практика , но това е поне нещо, което можете да използвате за крайния си случай. Така че нещо в реда на:

Във вашата 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;

И след това във вашата 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();
}

Като алтернатива, разбира се, вече можете да зададете правилния $removedPageId стойност по време на изграждането на вашата Revision , тогава дори не е необходимо да изпълнявате обратно извикване на жизнения цикъл при премахване.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Division, използващ „не съществува“ в mysql

  2. Максимален брой колони/стойности, които можете да ВМЕСИТЕ В таблица - mysql

  3. Какво обикновено е по-бързо, прехвърляне през файлове или изпълняване на SQL LIKE %x% заявка през blobs?

  4. sphinx търсене за частични съвпадения на ключови думи

  5. Типът Mysql Time дава ArgumentError:аргумент извън обхвата в Rails, ако е над 24 часа