soszin
5.09.2013, 22:29:11
Witam,
Zwracam się do was z nasŧępującym problemem.
Robie pewien importer książek, chciałem zrobić do niego statystyki. Chodzi mi ile rekordów zostało zaaktualizowanych.
Z tego co mi się wydaje ORM nie aktualizuje rekordu jeśli nie zostały wprowadzone zmiany np.
$updateBooks->values($to_update);
$update_book = $updateBooks->save();
Myślałem ze save() zwróci mi TRUE lub FALSE jesli rekord został zmodyfikowany lub nie, jednakże jak to orm wypluwa wszystko co sie da, lecz nie to co mnie interesuje.
probowałem jeszcze korzystac z metody saved(); lecz tez nic. (chyba ze zle robilem)
Moje pytanie brzmi: Jak sprawdzić czy na danym rekordzie została wykonana jakaś zmiana czy też nie.
Pozdrawiam i czekam na odpowiedzi.
kujol
5.09.2013, 22:33:36
Porównujesz stary rekord z nowym. Jeśli identyczny to brak zmiany, a jeśli jest różnica to jest zmiana .
phpion
6.09.2013, 06:42:53
Po wykonaniu metody values(), a przed save() spróbuj sprawdzić tablicę zwracaną przez changed(). Jeśli jest pusta - nie będzie zmian (i save() możesz sobie odpuścić), jeśli nie jest pusta - zmiany zostaną naniesione.
soszin
6.09.2013, 07:18:35
$save_values =$updateBooks->values($to_update);
print_r($save_values->changed()); // changed powinien przyjmować pola ktore maja zostać sprawdzone, ja mam sporo tych pull by wypisywac je z palucha.
$update_book = $updateBooks->save();
tablica changed nie zwraca mi nic co rozwiązałoby problem, Chyba że źle jej używam.
Jakieś pomysły?
phpion
6.09.2013, 07:31:10
A tak?
$updateBooks->values($to_update);
$updateBooks->save();
Analogiczny kod u mnie działa:
$obj = ORM::factory('Page', 1);
'title' => 'stary'
));
print_r($obj->changed()); // array() 'title' => 'nowy'
));
print_r($obj->changed()); // array('title' => 'title');
Cytat(soszin @ 6.09.2013, 08:18:35 )

// changed powinien przyjmować pola ktore maja zostać sprawdzone, ja mam sporo tych pull by wypisywac je z palucha.
Jeśli nie przekażesz parametru konkretnego pola to zwrócone zostaną wszystkie zmodyfikowane pola.
soszin
6.09.2013, 07:40:41
Czy modyfikuje coś czy też nie changed() zwraca mi:
Array ( [publishing
] => publishing
[height
] => height
[width
] => width
[pages
] => pages
[price_1
] => price_1
[price_2
] => price_2
[price_3
] => price_3
)
phpion
6.09.2013, 07:44:11
W takim razie albo faktycznie zmieniasz te pola (chociażby przekazując taką samą wartość ale innego typu - przekazuj stringi), albo nie wiem. U mnie na Kohanie 3.2 na pewno działa wykrywanie zmian, na 3.3 też pewnie zadziała.
soszin
6.09.2013, 07:49:12
Ok. Będę się jeszcze z tym bawił, Dane są importowane z pliku CSV, postaram sie wszystko wytrimować bo może faktycznie jakięś zmiany zachodzą przy rozbijaniu csv. (bardzo możliwe że już wiem nawet gdzie:))
Jak się uda zrobić to dam znac:) Może się komuś przyda, a Tobię dzięki za pomoc.
--->
phpion czy changed działa tylko na stringach? Bo jeśli faktycznie w bazie danych zmieniłem typ pola na varchar (ale importowane tane musialem zrzutować na (string)) to wtedy zwraca mi czy zmiany zostały dokonane. Kolejno ustawiłem ponownie dla pol CENA itp typ double i importujac ten rekord z csv
rzutowałem wartosc na (double) i też nie działało tylko wykrywało zmiany mimo że ich nie było.
Używając dla każdego pola w bazie varchar nie jest chyba zbyt optymalne?
phpion
6.09.2013, 08:25:59
Do metody values() przekaż dane jako stringi, pola w bazie niech będą odpowiednich typów. Czyli przykładowo nie:
values(array('x' => 1))
tylko:
values(array('x' => '1'))
gdzie x to kolumna integer.
Swoją drogą: po co do takiej synchronizacji zaprzęgasz ORM? Dużo bardziej optymalnie byłoby:
1. LOAD DATA do tymczasowej tabeli z csv.
2. UPDATE istniejących rekordów.
3. INSERT nowych.
4. DELETE usuniętych.
Całość zamykasz zatem w maksymalnie 4 zapytaniach robiąc wszystko po stronie bazy danych.
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.