2013-07-23 32 views
6

Sau khi deserializing thành công một chuỗi json thành một thực thể Doctrine với các liên kết. Khi kiên trì, Doctrine phát hiện các liên kết này là "các thực thể mới" luôn. Làm cách nào tôi có thể cập nhật các liên kết chỉ bằng ID và không thay đổi các giá trị pháp nhân có liên quan nếu có bất kỳ thay đổi nào?Các thực thể Doctrine tồn tại với các liên kết đã được deserialized với JMSSerializer

Trường hợp của tôi:

Tôi có một số bảng cơ sở dữ liệu có dữ liệu tĩnh. Cách đơn giản nhất là để lưu trữ các đơn vị. (Tôi có một thực thể học thuyết gọi là Đơn vị). Bảng giống như sau:

|id|name |ratio | 
|1 |mgr |1  | 
|2 |gr |1000 | 
|3 |Kgr |1000000| 

Sau đó, người dùng có thể tạo một Mặt hàng, cũng có thực thể học thuyết phía máy chủ được gọi là Đơn vị. Tôi sử dụng một khách hàng mô hình backbone.js bên và khi cập nhật nó gửi đến ứng dụng Symfony2 của tôi như thế này:

//Item object to be serialized into Item entity 
{ 
    id: 13141 
    weight: 100 
    unit: { 
     id:1 
     name:mgr 
     ratio:1 
    } 
    //many more attributes here 
} 

Bây giờ, tôi deserialize với JMSSerializer, mọi thứ đều ổn, nhưng tôi muốn học thuyết để cập nhật chỉ Unit ID của mối quan hệ, chứ không phải toàn bộ Đơn vị.

Khi tôi kiên trì, giáo lý than phiền và nói với tôi rằng ông đã tìm thấy một "thực thể Đơn vị mới" (không phải là điều tôi muốn) và yêu cầu tôi đặt cascade thành persist trong Thực thể học thuyết. Nhưng nếu tôi làm điều này và ai đó sửa đổi json đơn vị, sẽ không thay đổi bảng đơn vị tĩnh của tôi?

Ví dụ: Xấu người dùng đổi các Json bằng cách gửi này:

//BAD item object to be serialized into Item entity 
{ 
    id: 13141 
    weight: 100 
    unit: { 
     id:1 
     name:BadName //Will this get persisted to the database? 
     ratio:1 
    } 
    //many more attributes here 
} 

Tôi chắc chắn không muốn điều này xảy ra. Tôi chỉ muốn thêm Đơn vị có id: 1 vào mục.

Trường hợp này rất đơn giản và tôi có thể tìm nạp đơn vị theo Id và sau đó đặt đơn vị đó thành thực thể, nhưng trong ứng dụng thực, mục thực thể của tôi lớn hơn nhiều nên tôi muốn xử lý tự động.

¿Bất kỳ ý tưởng nào?

Trả lời

4

Để tôi thực hiện việc này:

Khi bạn deserialize văn bản loại thành viên đơn vị là gì? có phải là class bản sao chỉ là array?

Nếu tôi hiểu đúng và nó là class Ví dụ, bạn có thể thiết lập cascade để merge (không persist) trên unit thuộc tính để bạn có thể làm:

$em = ...; // your entity manager 
$item = $em->merge($item); // merge will cascade to `unit` property as well 

Hope this helps ...

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