Tôi đã sử dụng cấp truy cập cơ sở dữ liệu dựa trên truy vấn SQL trong một thời gian dài. Nhưng bây giờ tôi quyết định sử dụng ORM Doctrine2. Tại thời điểm này, tôi có một sự hiểu lầm khái niệm về các luồng công việc thực thể.Làm cách nào để loại bỏ các thay đổi không bị xóa đối với một thực thể trong Doctrine 2?
mô tả tốt nhất bằng ví dụ:
try {
$user = $entityManager->find('User', 1);
$user->setName('New name');
$entityManager->flush();
}
catch (...)
{
// !we are here: changes failed and $user-row in DB was not updated
}
// ...
$user = $entityManager->find('User', 1);
$user->setOther('Other');
$entityManager->flush(); // <- in this request both [other] and [name] fields will be updated to DB, but only [other] update expected
Trong khối mã đầu tiên tôi lấy $ đối tượng người dùng. Đã thay đổi [name] và cố gắng lưu nó nhưng không thành công. Trong khối thứ hai (không liên quan đến lần đầu tiên), tôi đã lấy lại $ object object. Nhưng ORM trả về liên kết đến cùng một đối tượng như lần đầu tiên. Vì vậy, đối tượng này đã thay đổi thuộc tính [name]. Trong dòng cuối cùng của khối thứ hai tôi muốn lưu chỉ [khác] nộp, nhưng cả hai [khác] và [tên] sẽ được cập nhật.
Cách đúng để giải quyết tình huống này là gì?
Câu trả lời này không phải là câu trả lời hay nhất: nếu bất kỳ đối tượng nào trong trạng thái 'managed' (nghĩa là: được xử lý bởi' entityManager' dùng để chỉ đối tượng tách rời, học thuyết sẽ nghĩ rằng đối tượng tách rời đó là một đối tượng mới. hoạt động xếp tầng được cấu hình, một chèn sẽ được thực hiện.Nếu không có hoạt động xếp tầng liên tục được cấu hình, một lỗi "một thực thể mới đã được tìm thấy ..." sẽ được nâng lên. – DonCallisto