Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][SF2][Symfony2]Nie pobiera danych z bazy danych
Forum PHP.pl > Forum > PHP > Frameworki
Crash89
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. }
lukaskolista
po getQuery() zamiast getResult() daj getSql() i zobacz, jakie zapytanie jest wykonywane
Crash89
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.
lukaskolista
Skoro zapytanie jest dobrze, to znaczy, że problem tkwi gdzieś indziej.
Crash89
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...
lukaskolista
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.
Pilsener
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ć.
Crash89
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.
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.