Wpis z mikrobloga

jak w tym #!$%@? #doctrine usunąć entity z managera żeby nie było ono wrzucane do bazy ? o co mi chodzi - mam sobie entity które ma inne entity, edytuje to inne entity, tylko że zanim zapisze szukam czy nie ma podobnego rekordu dla podobnych wprowadzonych danych, jeśli jest to ustawiam już na to istniejące tylko że doctrine i tak uparcie robi insert into tego co wpiszę w formie i mam dwa razy te same dane, wtf ? #symfony detach i inne cuda nie działają co najgorsze nie wiem skąd mu się to bierze
#webdev #php #symfony #symfony2
  • 26
  • Odpowiedz
Nie do końca rozumiem. Edytujesz inne entity i leci insert? Miałeś chyba na myśli update. Niemniej jeżeli chodzi o dodawanie to wywołaj persist tylko na tych obiektach, ktore ostatecznie maja trafic do bazy danych. Jeżeli z jakichs powodów nie możesz tego zagwarantować, to użyj detach na obiekcie który jednak nie ma być dodany, powinno pomoc.
  • Odpowiedz
@Jurigag: Zobacz sobie merge. Jeśli obiekt jest w bazie to doctrine powinien go zaselectować i zaindeksować sobie, że ten obiekt już istnieje w bazie i nie należy go wrzucać. To jest najbardziej eleganckie, ale mało wydajne. Jak chcesz to ominąć i samemu zadbać o nie dublowanie danych to zmień cascade, żeby bez wyraźnego persista doctrine nie zapisywał.
  • Odpowiedz
@suawus: no właśnie detach gówno robi @czolnowski:

Mam sobie zamówienie załóżmy które ma numer klienta ID = 1, edytuję sobie dane tego klienta w zamówieniu, zmieniam go aby był to pan o imieniue XYZ ABC i numerze dowodu 12345, znajduję takiego w bazie jeśli istnieje i zmieniam w zamówieniu tego klienta na tego znalezionego, robię persist na zamówieniu i teraz dzieję się tak:

jak nie ma detacha na zamówieie->getClient() to ten początkowy klient jest aktualizowany o informacje z wysłanego formularza czyli XYZ ABC i numer dowodu 12345
jak jest detach na zamówienie->getClient() to jest wrzucany nowy klient z danymi w podanymi w formularzu(skąd się to
  • Odpowiedz
@Jurigag: Nie wiem czy dobrze rozumiem pytanie, ale wg mnie po znalezieniu w bazie pasujacego klienta robisz zamowienie->setClient($znaleziony); wtedy powinno sie zapisac dobrze pod warunkiem ze zrobisz flush($zamowienie) a nie flush(). Samo flush zapisze wszystko lacznie z nowym klientem pochodzacym z formularza.
Co do wrzucania nowego z formularza to dziala to tak jak powinno.
  • Odpowiedz
@gajowy_marucha: tak robie i dodaje ten z formularza jako nowy rekord xD przecież napisałem wyżej jak się zachowuje, jak jest detach to dodaje ten z formularza, jak nie ma to aktualizuje ten początkowy co był xD
  • Odpowiedz
@uirapuru: ja #!$%@?, tera kolejny problem - jak nie znajdzie podobnych i będzie się różnić od tego co było przed wysłaniem formularza to chcę żeby tworzyło nowy - no i super tworzy mi nowy, tylko że #!$%@? dwa razy, jakie to #!$%@? jest xD a dałem już detach wszędzie gdzie się da, jak go nie dam to aktualizuje po prostu ten co jest przed i wrzuca nowy, #!$%@?, jak można
  • Odpowiedz
@Jurigag: a ma on jakąś relację do innej encji? bo może podłączasz do owning side jakiejś i ją zapisujesz - wtedy prawdopodobnie pojdzie kaskada, a potem persystujesz znowu i zapisujesz kolejnny raz - tworzy jako nową encje w bazie.
  • Odpowiedz
@uirapuru: no tak pisałem, jest zamówienie które ma przypisanego klienta, także jest relacja i są jakieś te kaskady, tylko że to jest zapisywane dwa razy podczas czegoś takiego kuźwa:

$xyz = new FinalCarUser();
$xyz->import($finalCarUser);
$em->persist($xyz);
$em->flush($xyz);
  • Odpowiedz
@uirapuru: no on sobie robi jakieś zapisy samemu z dupy bo mimo że daję detach na $rentOrder->getFinalCarUser() to zapisuje sobie z $finalCarUser stamtąd xD jedynie tyle to zmienia że wrzuca jako nowe zamiast aktualizować xD
  • Odpowiedz