2012-05-25 23 views
6

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ì?

Trả lời

14

Đây là theo thiết kế.

Trình quản lý đối tượng đảm bảo rằng bạn luôn nhận được cùng một thực thể cho một id đã cho. Sau khi tất cả, đó là những gì có nghĩa là nhận dạng. Chỉ có thể là người dùng duy nhất, duy nhất có id 1.

Nếu bạn muốn "làm mới" một thực thể từ cơ sở dữ liệu, EntityManager::refresh() sẽ làm điều đó cho bạn. Từ tài liệu:

Làm mới trạng thái kiên trì của thực thể từ cơ sở dữ liệu, ghi đè bất kỳ thay đổi cục bộ nào chưa được duy trì.

2

Bạn phải thực thi lệnh: $entityManager->detach($userEntity);. Những thay đổi sau đó sẽ không được phản ánh trong cơ sở dữ liệu sau khi bạn gọi tuôn ra. Các thực thể khác sẽ hoạt động.

+2

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

Các vấn đề liên quan