Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tắt ràng buộc khóa ngoại Doctrine

Theo định nghĩa bạn không thể xóa bản ghi mà khóa ngoại đang trỏ đến mà không đặt khóa thành null (onDelete="SET NULL" ) hoặc xếp tầng thao tác xóa ( Có hai tùy chọn - Mức ORM:cascade={"remove"} | cấp cơ sở dữ liệu:onDelete="CASCADE" ).
Có một lựa chọn thay thế cho đặt giá trị mặc định của một bản ghi vẫn tồn tại , nhưng bạn phải thực hiện điều đó theo cách thủ công, tôi không nghĩ Doctrine hỗ trợ điều này "out-of-the-box" (vui lòng sửa cho tôi nếu tôi sai, nhưng trong trường hợp này, việc đặt giá trị mặc định không được mong muốn).

Sự nghiêm ngặt này phản ánh khái niệm có các ràng buộc khóa ngoại; như @ Théo đã nói:

Xóa mềm (đã được đề cập) là một giải pháp, nhưng những gì bạn cũng có thể làm là thêm một removed_page_id bổ sung mà bạn đồng bộ hóa với page_id ngay trước khi bạn xóa nó trong preRemove xử lý sự kiện (gọi lại vòng đời). Tôi thắc mắc liệu những thông tin đó có giá trị gì không nhưng tôi đoán bạn cũng có ích cho nó, nếu không thì bạn sẽ không hỏi câu hỏi này.

Tôi chắc chắn không khẳng định đây là phương pháp hay , nhưng nó ít nhất là thứ mà bạn có thể sử dụng cho chiếc ốp lưng của mình. Vì vậy, một cái gì đó trong dòng:

Trong Revision của bạn :

/**
 * @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;

Và sau đó trong Page của bạn :

/** 
 * @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();
}

Ngoài ra, tất nhiên bạn có thể đã đặt đúng $removedPageId giá trị trong quá trình xây dựng Revision của bạn , thì bạn thậm chí không cần thực hiện một lệnh gọi lại vòng đời khi xóa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi hàng thành cột từ các bảng khác nhau và số hàng khác nhau (liên hợp) trong MySQL phiên bản 8.0.17 bằng cách sử dụng Pivot

  2. Làm cách nào để thêm 1 giờ vào currrent_timestamp trong mysql, giá trị mặc định là giá trị?

  3. nhóm theo tháng của trường dấu thời gian unix

  4. Dữ liệu phân cấp trong MySql

  5. Truy vấn MySQL với số lượng và nhóm theo