2013-07-23 22 views
6

Po pomyślnym deserializacji łańcucha JSON do jednostki Doctrine ze skojarzeniami. W przypadku uporczywości Doctrine zawsze identyfikuje te powiązania jako "nowe elementy". Jak mogę zaktualizować powiązania po prostu przez identyfikator i nie zmieniać wartości powiązanych jednostek, jeśli są jakieś zmiany?Trwałe jednostki doktryny z powiązaniami, które zostały deserialized z JMSSerializer

Mój przypadek:

Mam niektóre tabele bazy danych z danymi statycznymi. Najprostszy służy do przechowywania jednostek. (Mam jednostkę doktryny zwaną Jednostką). Stół jest tak:

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

Następnie, użytkownik może stworzyć produkt, który ma również podmiot po stronie serwera doktryny o nazwie Jednostka. Używam klienta modelu backbone.js boczne i po aktualizacji to wysłał do mojego Symfony2 aplikacji tak:

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

Teraz deserializowania z JMSSerializer, wszystko jest w porządku, ale chcę doktryna zaktualizować tylko identyfikator jednostki relację, a nie całą Jednostkę.

Kiedy upiera się, doktryna skarży się i mówi mi, że znalazł "nową jednostkę jednostki" (co nie jest tym, czego chcę) i każe mi ustawić kaskadę na persist w encji doktryny. Ale jeśli to zrobię, a ktoś zmieni urządzenie json, czy to nie zmieni mojej tablicy jednostek statycznych?

Na przykład: Bad użytkownik modyfikuje JSON, wysyłając w ten sposób:

//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 
} 

pewno nie chcemy aby tak się stało. Chcę tylko dodać jednostkę o id: 1 do przedmiotu.

Ten przypadek jest prosty i mogłem po prostu pobrać jednostkę przez Id, a następnie ustawić ją na encję, ale w mojej prawdziwej aplikacji jednostka Item jest znacznie większa, więc chcę obsłużyć to automatycznie.

¿Wszelkie pomysły?

Odpowiedz

4

Niech mi to wprost:

Kiedy deserializowania tekst co jest typem członka jednostki? czy jest to instancja o numerze class tylko o numerze array?

Jeśli dobrze zrozumiałem i to class przykład, można ustawić cascade do merge (nie persist) na unit własności więc można zrobić:

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

Nadzieja to pomaga ...

Powiązane problemy