Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SF][SF2][Symfony2]Nie pobiera danych z bazy danych
Crash89
post 27.11.2016, 11:39:50
Post #1





Grupa: Zarejestrowani
Postów: 191
Pomógł: 7
Dołączył: 3.04.2013

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


Mam taki problem, otóż wszystko działa prawie prawidłowo. Chcę pobrać z bazy informację czy użytkownik juz zagłosował na dany product i na jeden produkt są zwracane dane ale na inne nie.
Mimo tego że gdy w phpmyadmin ręcznie wpisując dane wszystko się zgadza.

To jest kod który to obsługuje:

  1. public function checkIfUserVote($user, $product)
  2. {
  3. if($user === 'anon.')
  4. {
  5. return true;
  6. }
  7.  
  8. $rate = $this->em->getRepository('AppBundle:Rate')->getRateProductUser($user->getId(),$product->getId());
  9.  
  10.  
  11.  
  12. if(!empty($rate))
  13. {
  14. return false;
  15. }else{
  16. return true;
  17. }
  18. }


i w repozytorium:

  1.  
  2. public function getRateProductUser($productId, $userId)
  3. {
  4. return $this->createQueryBuilder('r')
  5. ->where('r.product = :product AND r.user = :user')
  6. ->setParameter('product',$productId)
  7. ->setParameter('user',$userId)
  8. ->getQuery()
  9. ->getResult();
  10. }


Ten post edytował Crash89 27.11.2016, 11:40:41
Go to the top of the page
+Quote Post
lukaskolista
post 27.11.2016, 12:27:59
Post #2





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


po getQuery() zamiast getResult() daj getSql() i zobacz, jakie zapytanie jest wykonywane
Go to the top of the page
+Quote Post
Crash89
post 27.11.2016, 13:00:08
Post #3





Grupa: Zarejestrowani
Postów: 191
Pomógł: 7
Dołączył: 3.04.2013

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


Cytat(lukaskolista @ 27.11.2016, 12:27:59 ) *
po getQuery() zamiast getResult() daj getSql() i zobacz, jakie zapytanie jest wykonywane



Takie jest wykonywane, czyli dobre:

  1. string 'SELECT r0_.id AS id_0, r0_.rate AS rate_1, r0_.deletedAt AS deletedAt_2, r0_.created AS created_3, r0_.updated AS updated_4, r0_.contentChanged AS contentChanged_5, r0_.product_id AS product_id_6, r0_.user_id AS user_id_7 FROM rate r0_ WHERE r0_.product_id = ? AND r0_.user_id = ?'


Dla produktu który znajduje i nie, tworzy takie same zapytania.
Użytkownika narazie używam jednego, więc tutaj to nie będzie problem.
Go to the top of the page
+Quote Post
lukaskolista
post 27.11.2016, 13:04:29
Post #4





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Skoro zapytanie jest dobrze, to znaczy, że problem tkwi gdzieś indziej.
Go to the top of the page
+Quote Post
Crash89
post 27.11.2016, 13:12:56
Post #5





Grupa: Zarejestrowani
Postów: 191
Pomógł: 7
Dołączył: 3.04.2013

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


Cytat(lukaskolista @ 27.11.2016, 13:04:29 ) *
Skoro zapytanie jest dobrze, to znaczy, że problem tkwi gdzieś indziej.


Już wiem gdzie tkwił problem, odwrotnie wprowadziłem zmienne do zapytania...
Go to the top of the page
+Quote Post
lukaskolista
post 27.11.2016, 13:20:46
Post #6





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Do głowy przychodzą mi 2 sposoby zapobiegania takim pomyłkom:
1. przekazuj całe obiekty zamiast ich id
2. niech id będą "value objects" - nie wiem jak to po polsku się nazywa. Np. UserId i ProductId

Czemu dobrze zastosować jeden z nich? Niby błąd programisty i kod jest ok, ale gdyby taki błąd był w dużej i skomplikowanej aplikacji (która nie powinna powstać, bo powinna być rozbita na mniejsze usługi, ale załóżmy, że istnieje), to jego znalezienie mogło by być problemem.

Dobrze jest po prostu zapobiegać takim sytuacjom.

Ten post edytował lukaskolista 27.11.2016, 13:23:36
Go to the top of the page
+Quote Post
Pilsener
post 28.11.2016, 09:00:30
Post #7





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Cytat
po getQuery() zamiast getResult() daj getSql() i zobacz, jakie zapytanie jest wykonywane
- nie ma takiej potrzeby, każde zapytanie jest wyświetlone w profilerze.

  1. if($user === 'anon.')
  2. {
  3. return true;
  4. }

1. User to jest nazwa użytkownika, login, obiekt "user", status jakiś? Nazwa zmiennej powinna odzwierciedlać jej zawartość.
2. Metoda nazywa się "checkIfUserVote" a sprawdza czy user to string "anon.", za chwilę założysz temat "dlaczego użytkownik ma zaznaczone, że głosował jak nie oddał głosu"

  1. $this->em->getRepository('AppBundle:Rate')
- nie powinno się tworzyć repozytoriów w taki sposób, lecz deklarować je jako serwisy oraz dostarczać jako zależność. Inaczej znów tworzymy sobie problem.

I po co używasz Doctrine skoro i tak nie używasz obiektów a do najprostszych zapytań piszesz DQL?
Przecież wystarczy:
  1. $product = $user->getProduct();
  2. //lub, gdy user ma wiele produktów
  3. $product = $user->getProducts()->filter();

Ewentualnie ->matching lub ->findBy, do DQLa jeszcze dużo brakuje. A jeśli nie chcesz używać ORMa (bo nie ma takiego obowiązku przecież) to nie prościej używać tylko PDO?

Trzeba po prostu lepiej organizować kod bo inaczej zawsze będą problemy a w dodatku ciężko będzie cokolwiek poprawić.
Go to the top of the page
+Quote Post
Crash89
post 3.12.2016, 18:58:50
Post #8





Grupa: Zarejestrowani
Postów: 191
Pomógł: 7
Dołączył: 3.04.2013

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


Cytat(Pilsener @ 28.11.2016, 09:00:30 ) *
- nie ma takiej potrzeby, każde zapytanie jest wyświetlone w profilerze.

  1. if($user === 'anon.')
  2. {
  3. return true;
  4. }

1. User to jest nazwa użytkownika, login, obiekt "user", status jakiś? Nazwa zmiennej powinna odzwierciedlać jej zawartość.
2. Metoda nazywa się "checkIfUserVote" a sprawdza czy user to string "anon.", za chwilę założysz temat "dlaczego użytkownik ma zaznaczone, że głosował jak nie oddał głosu"

  1. $this->em->getRepository('AppBundle:Rate')
- nie powinno się tworzyć repozytoriów w taki sposób, lecz deklarować je jako serwisy oraz dostarczać jako zależność. Inaczej znów tworzymy sobie problem.

I po co używasz Doctrine skoro i tak nie używasz obiektów a do najprostszych zapytań piszesz DQL?
Przecież wystarczy:
  1. $product = $user->getProduct();
  2. //lub, gdy user ma wiele produktów
  3. $product = $user->getProducts()->filter();

Ewentualnie ->matching lub ->findBy, do DQLa jeszcze dużo brakuje. A jeśli nie chcesz używać ORMa (bo nie ma takiego obowiązku przecież) to nie prościej używać tylko PDO?

Trzeba po prostu lepiej organizować kod bo inaczej zawsze będą problemy a w dodatku ciężko będzie cokolwiek poprawić.



Metoda IfUserVote dokładnie sprawdza czy użytkownik ma prawo głosu na dany produkt.
Sprawdzam czy user jest stringiem bo taką daną zwraca metoda z kontrolera, która pobiera zalogowanego użytkownika. Jeśli nie jest zalogowany to zwraca 'anon.'.
Zwracam prawdę bo i tak jeśli nie zalogowany użytkownik zagłosuje to wyświetli mu się strona do logowania, i problem załatwiony.

Z tymi zapytaniami do doctrine to chciałem stworzyć zapytanie, które pobierze dany głos (rate) oddany przez zalogowanego użytkownika i dotyczący danego produktu.
teraz się dowiedziałem że można to zrobić tak i dql nie jest potrzebny:
  1. $product = $repository->findOneBy(array('name' => 'foo', 'price' => 19.99));


Myślałem że to jest ograniczone do jednego parametru.
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: 20.04.2024 - 02:42