Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [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
 
Start new topic
Odpowiedzi
Pilsener
post 28.11.2016, 09:00:30
Post #2





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 #3





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

Posty w temacie


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: 26.06.2025 - 22:32