Tôi có một vấn đề lạ với \Doctrine\ORM\UnitOfWork::getScheduledEntityDeletions
sử dụng bên trong onFlush
kiệntổ chức theo lịch trình trong onFlush là khác nhau ví dụ
foreach ($unitOfWork->getScheduledEntityDeletions() as $entity) {
if ($entity instanceof PollVote) {
$arr = $entity->getAnswer()->getVotes()->toArray();
dump($arr);
dump($entity);
dump(in_array($entity, $arr, true));
dump(in_array($entity, $arr));
}
}
Và đây là kết quả:
Vì vậy, chúng ta thấy rằng đối tượng là chỉ đến một trường hợp khác với bản gốc, do đó, in_array
không còn mang lại kết quả mong đợi khi được sử dụng với so sánh thanh (AKA ===
). Hơn nữa, đối tượng \DateTime
trỏ đến một cá thể khác.
duy nhất có thể giải thích tôi thấy như sau (source):
Bất cứ khi nào bạn lấy một đối tượng từ học thuyết cơ sở dữ liệu sẽ giữ một bản sao của tất cả các thuộc tính và các hiệp hội bên trong UnitOfWork. Bởi vì các biến trong ngôn ngữ PHP phải chịu "copy-on-write", việc sử dụng bộ nhớ của một yêu cầu PHP chỉ đọc các đối tượng từ cơ sở dữ liệu giống như khi Doctrine không giữ bản sao biến này. Chỉ khi bạn bắt đầu thay đổi biến PHP sẽ tạo biến mới trong nội bộ tiêu thụ bộ nhớ mới.
Tuy nhiên, tôi không thay đổi bất cứ điều gì (ngay cả trường created
được giữ nguyên). Các hoạt động chỉ được preformed trên thực thể là:
\Doctrine\ORM\EntityRepository::findBy
(lấy từ DB)\Doctrine\Common\Persistence\ObjectManager::remove
(lập kế hoạch cho việc loại bỏ)$em->flush();
(kích hoạt đồng bộ hóa với DB)
Dẫn tôi suy nghĩ (tôi có thể sai) rằng phương pháp theo dõi thay đổi của Giáo Lý không liên quan gì đến vấn đề tôi đang gặp phải. Dẫn tôi đến câu hỏi sau:
- điều này gây ra là gì?
- Làm thế nào để kiểm tra một cách đáng tin cậy nếu một thực thể được lên kế hoạch xóa bên trong một bộ sưu tập (
\Doctrine\Common\Collections\Collection::contains
sử dụngin_array
với so sánh nghiêm ngặt) hoặc các mục nào trong bộ sưu tập được lên lịch xóa?
Có vẻ như tôi đã gặp sự cố tương tự ngày hôm nay. Bạn có xóa thực thể của mình một cách rõ ràng không? Hoặc nó được loại bỏ bởi thác? –
@AndreyMischenko '\ Doctrine \ Common \ Persistence \ ObjectManager :: remove' được gọi trên thực thể được đề cập. Không có thác nào liên quan đến trường hợp của tôi – Xymanek
@AndreyMischenko bạn có quản lý để tìm giải pháp không? – Xymanek