Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Doctrine 2] Wyświetlanie ilości pasujących wyników
Forum PHP.pl > Forum > Bazy danych > MySQL
kilaz91
Witam,
mam dość zaawansowaną wyszukiwarkę w której potrzebuję wyświetlić dodatkowo ilość pasujących wyników.

np checkboxy
"
funkcje:
[] wifi (12)
[] bluetooth (16)
[] android (5)
"

coś na zasadzie jak na allegro w wyszukiwaniach.

Czy ktoś mi może pomóc w znalezieniu rozwiązania albo napisać pod jaką nazwą tego szukać? Taka opcja jest coraz częściej używana więc chyba powinno to mieć swoją terminologie albo nazwę funkcji.
Oczywiście jeżeli doctrine 2 zawiera taką funkcję to byłbym wdzięczy za jej wskazanie smile.gif szukam i nie mogę znaleźć

Dzięki i pozdrawiam,
Konrad
Forti
Robisz zapytanie typu select partial t.{id,name} from YourBundleBundle:Acme where .... I kończysz funkcja GetScalarResults czy jakos tak. Z palca nie pamiętam nazwy.
To ci zwraca ilość. Wydajniej bedzie zrobić native query i po prostu execute().

Generalnie dla każdego jest inne zapytanie. Można to na to jakiś cache nałożyć itp.
Crozin
Do czegoś takiego powinieneś raczej wykorzystać narzędzia typu Solr, które udostępnia coś takiego jak Faceted Search:
- http://wiki.apache.org/solr/SolrFacetingOverview
- https://wiki.apache.org/solr/SimpleFacetParameters
Generalnie wykorzystywanie zwykłej, relacyjnej bazy danych do tego będzie raczej mało wydajne, a przede wszystkim mało wygodne.
kilaz91
Hmm, ciężko będzie z takim rozwiązaniem - hosting ograniczony.

Może pomysł na utworzenie funkcji ? smile.gif

Dzięki
Forti
Jezeli nie możesz zrobić tego co podał Crozin to tylko przychodzi mi do głowy coś takiego:

1. Dla każdej kategorii zapytanie o ilość produktów w czasie renderowania strony - strasznie nie wydajne
2. Przy tworzeniu produktu do kategorii w pole np. "number_of_products" dodajesz +1, analogicznie przy usuwaniu -1. Można również triggery w mysql założyć które same będą to robić - łatwo popełnić błąd tutaj tongue.gif
kilaz91
Ok, mam coś takiego:
  1. [obiekt_jakis_1]
  2. (
  3. [featureForm] => Array
  4. (
  5. [0] => Array
  6. (
  7. [id] => 38
  8. [count] => 1
  9. [formId] => 133
  10. )
  11. [1] => Array
  12. (
  13. [id] => 49
  14. [count] => 0
  15. [formId] => 135
  16. )
  17. )
  18. )
  19.  
  20. [obiekt_jakis_2]
  21. (
  22. [featureForm] => Array
  23. (
  24. [0] => Array
  25. (
  26. [id] => 48
  27. [count] => 1
  28. [formId] => 133
  29. )
  30. [1] => Array
  31. (
  32. [id] => 52
  33. [count] => 1
  34. [formId] => 135
  35. )
  36. )
  37. )

count - jeżeli 1, zawiera cechę o id "formId"

teraz mam zapytanie do bazy (trochę warunków WHERE)

$qb -> from('Application\Entity\Phone', 'p');
$qb -> join('p.link','l');
$qb -> where('p.active = 1');
$qb -> leftJoin('p.prices','price');
$qb -> andWhere('price.value > :minPrice');
$qb -> andWhere('price.value < :maxPrice');
$qb -> setParameter('minPrice',$minPrice);
$qb -> setParameter('maxPrice',$maxPrice);

Po czym do zapytania dołączam:
foreach($form as $id =>$value)
$qb -> leftJoin('p.featureForm','formId_'.$id,'WITH','formId_'.$id.'.count = 1 AND 'formId_'.$id.'.answerId = '.$id);


Lecz problem w tym że gdy w select odwołam się do "count(formId_$id) as ct_form_$id ",
otrzymuję wynik nieuwzględniający np cen.
Co prawda mógłbym dodać warunki where do left join ale to byłoby masakrycznie niewydajne.

Jak można odwołać się do zewnętrznej tabeli tak żeby zliczyła tylko te wartości które są zwracane w tym zapytaniu a nie jak to ma teraz miejsce że odwołuje się do wszystkich elementów (nawet nieaktywnych i niemieszczących się z zakresie cen)?

Pozdrawiam,
Konrad
Forti
Cytat
Jak można odwołać się do zewnętrznej tabeli tak żeby zliczyła tylko te wartości które są zwracane w tym zapytaniu a nie jak to ma teraz miejsce że odwołuje się do wszystkich elementów (nawet nieaktywnych i niemieszczących się z zakresie cen)?


Z tego co mi wiadomo to próbujesz przekombinować. Podałem Ci rozwiązanie posty wyżej. Nie próbuj na siłe wszystkiego upychać w jednym zapytaniu bo to będzie straszne.

  1. $qb -> from('Application\Entity\Phone', 'p');
  2. $qb -> join('p.link','l');
  3. $qb -> where('p.active = 1');
  4. $qb -> leftJoin('p.prices','price');
  5. $qb -> andWhere('price.value > :minPrice');
  6. $qb -> andWhere('price.value < :maxPrice');
  7. $qb -> setParameter('minPrice',$minPrice);
  8. $qb -> setParameter('maxPrice',$maxPrice);


  1. $qb->from('Application\Entity\Phone', 'p')
  2. ->join('p.link','l')
  3. ->where('p.active = 1')
  4. //.....
kilaz91
Pisząc tego posta uświadomiłeś mi że wcale nie muszę tworzyć nowych zapytań tylko powielić te które już mam smile.gif
Człowiek ruszył w jednym kierunku i się tego trzymał - podstawowy błąd smile.gif

Dzięki wielkie!
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.