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.