![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 38 Pomógł: 1 Dołączył: 26.10.2012 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 324 Pomógł: 27 Dołączył: 21.07.2013 Ostrzeżenie: (0%) ![]() ![]() |
Porównujesz stary rekord z nowym. Jeśli identyczny to brak zmiany, a jeśli jest różnica to jest zmiana .
-------------------- ;)
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
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.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 38 Pomógł: 1 Dołączył: 26.10.2012 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
$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? Ten post edytował soszin 6.09.2013, 07:25:48 |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
A tak?
Analogiczny kod u mnie działa:
// 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. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 38 Pomógł: 1 Dołączył: 26.10.2012 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
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.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 38 Pomógł: 1 Dołączył: 26.10.2012 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
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? Ten post edytował soszin 6.09.2013, 08:18:17 |
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
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. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 23.06.2025 - 19:18 |