Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Kohana]ORM - UPDATE
soszin
post 5.09.2013, 22:29:11
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.
Go to the top of the page
+Quote Post
kujol
post 5.09.2013, 22:33:36
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 .


--------------------
;)
Go to the top of the page
+Quote Post
phpion
post 6.09.2013, 06:42:53
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.
Go to the top of the page
+Quote Post
soszin
post 6.09.2013, 07:18:35
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
Go to the top of the page
+Quote Post
phpion
post 6.09.2013, 07:31:10
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




A tak?
  1. $updateBooks->values($to_update);
  2. print_r($updateBooks->changed());
  3. $updateBooks->save();

Analogiczny kod u mnie działa:
  1. $obj = ORM::factory('Page', 1);
  2. $obj->values(array(
  3. 'title' => 'stary'
  4. ));
  5. print_r($obj->changed()); // array()
  6. $obj->values(array(
  7. 'title' => 'nowy'
  8. ));
  9. 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.
Go to the top of the page
+Quote Post
soszin
post 6.09.2013, 07:40:41
Post #6





Grupa: Zarejestrowani
Postów: 38
Pomógł: 1
Dołączył: 26.10.2012
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Czy modyfikuje coś czy też nie changed() zwraca mi:

  1. Array ( [publishing] => publishing [height] => height [width] => width [pages] => pages [price_1] => price_1 [price_2] => price_2 [price_3] => price_3 )
Go to the top of the page
+Quote Post
phpion
post 6.09.2013, 07:44:11
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.
Go to the top of the page
+Quote Post
soszin
post 6.09.2013, 07:49:12
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
Go to the top of the page
+Quote Post
phpion
post 6.09.2013, 08:25:59
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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.06.2025 - 19:18