Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF]Propel i save()
Forum PHP.pl > Forum > PHP > Frameworki
kkamis
Witam,

Być może podobny wątek istnieje już na forum - ja niestety nic takiego nie znalazłem...

Problem polega na tym, że przekazuje do akcji dane z formularza. Na ich podstawie mają zostać utworzone nowe rekordy w bazie danych jak i zaktualizowane już istniejące. O ile przy zapisie nowych rekordów funkcja propela save() zwraca liczbę 1 tak przy aktualizacji zwracane jest 0 choć sama aktualizacja następuje prawidłowo. Z tego co wyczytałem to funkcja ta zwraca liczbę "przetworzonych?" wierszy (być może źle zrozumiałem). Wydaje mi się, że w kodzie jest wszystko w porządku, ale mogę się oczywiście mylić...

Oto kod:

  1. foreach($_POST['obj'] as $obj) {
  2. if($obj['id']) {
  3. $update_obj = ObjPeer::retrieveByPK($obj['id']);
  4. } else {
  5. $update_obj = new Obj();
  6. }
  7. $update_obj->setValue($obj['value']);
  8. if(!$update_obj->save()) $success = false;
  9. }


Z góry dziękuję za wszelką pomoc i pozdrawiam smile.gif
arecki
Wczoraj na szybko odpisałem ale niestety nie do końca zgodnie z zadanym pytaniem tak więc dzisiaj jeszcze raz podszedłem do tematu i sprawdziłem w kodzie symfony, a właściwie to propela, jest.
Mianowicie doszedłem do metody public static function doUpdate(parametry...) w pliku sfPropelPlugin/lib/vendor/propel/util/BasePeer.php i z tego co mi się wydaje to affectet rows, czyli to co Ciebie interesuje zwracane jest z obiektu PDO. A z manuala wnioskować można że jest to zależne od rodzaju bazy i nie za bardzo można na tym polegać co oczywiście cytuje:
Cytat
PDOStatement::rowCount() returns the number of rows affected by the last DELETE, INSERT, or UPDATE statement executed by the corresponding PDOStatement object.

If the last SQL statement executed by the associated PDOStatement was a SELECT statement, some databases may return the number of rows returned by that statement. However, this behaviour is not guaranteed for all databases and should not be relied on for portable applications.

kkamis
Dziękuję za tak szybką odpowiedź. A czy istnieje jakiś sposób by rozwiązać ten problem? Szukałem w manualu, ale jakoś ciężko znaleźć coś co by temu odpowiadało. Oczywiście mogę sprawdzać po każdym zapisie/aktualizacji czy rekord istnieje, ale wtedy liczba zapytań może być ogromna i mija się to z celem...
arecki
Przeglądałem manual ale nic sensownego tam nie znalazłem. Na szybko myśląc możesz zrobić sobie jakieś pole "token", do którego podczas update'u rekordu wpiszesz wartość którą przez updatem sobie wygenerowałeś. Przed updatem, zapisz sobie ilość wierszy które miały być zmienione, a po updacie łatwo wyciągniesz te które miały być uaktualnione. Po tym sprawdzić czy ilość wierszy przed aktualizacją zgadza się z tą po aktualizacji. Potem czyść pole "token" i sprawa na szybko jest załatwiona. Nie wiem na ile to "eleganckie" rozwiązanie ale wydaje mi się że będzie pewne.
kkamis
Spróbuję... Dziękuje bardzo za pomoc smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.