Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SF2][SF][Doctrine2] Problem z zapytaniem orWhere/andWhere
swiezak
post 1.03.2016, 13:38:30
Post #1





Grupa: Zarejestrowani
Postów: 159
Pomógł: 0
Dołączył: 21.08.2011

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


Na poczatek struktura bazy danych:
produkt
id name price ...

products_categories
product_id category_id

categories
id name ...


attributes
id name

attribute_sets
id attribute_id product_id value

categories_attributes
category_id attribute_id

Mam formularz z multiselektami, ktory przekazuje do funkcji z repozytorium parametry, w tym id wartosci cechy produktu.
Probuje przy uzyciu query buildera wykonac zapytanie, ktore by mi zwrocilo pasujace rekordy - liste produktow z wartosciami cech zaznaczonych w formularzu. Jednak mam problem, bo gdy uzyje orWhere panuje istny chaos - zwracane sa niepoprawne wyniki, jesli zas uzyje andWhere pojawiaja sie poprawne wyniki, ale brane sa pod uwage tylko przekazane parametry z ostatniego checkboxa w ostatnim multiselekcie.

Zaznaczam w formularzu przykladowo (cecha | wartosc cechy):
pierwszy multiselect: kolor (pobierane jest id cechy) | bialy (pobierana jest wartosc cechy jako string)
drugi multiselect: typ (pobierane jest id cechy) | prawe (pobierana jest wartosc cechy jako string)

  1. class ProductsRepository extends \Doctrine\ORM\EntityRepository
  2. {
  3. public function search($searchParam) {
  4. extract($searchParam);
  5.  
  6. $qb = $this->createQueryBuilder('p')
  7. ->leftJoin('p.brands', 'b')
  8. ->addSelect('b')
  9. ->leftJoin('p.categories', 'c')
  10. ->addSelect('c')
  11. ->leftJoin('p.attributeSets', 't') // wartosci cech produktow
  12. ->addSelect('t');
  13.  
  14. if(!empty($brandId))
  15. $qb->andWhere('b.id = :brands')->setParameter('brands', $brandId);
  16. if(!empty($catId))
  17. $qb->andWhere('c.id = :categories')->setParameter('categories', $catId);
  18. if(!empty($attributeSetsVal)){
  19. print_r($attributeSetsVal); // zwracane jest: Array ( [6] => Array ( [0] => bialy ) [7] => Array ( [0] => prawe ) ) 6 i 7 to id cechy produktu
  20.  
  21. foreach($attributeSetsVal as $attribute){
  22. $qb->andWhere('t.value = :attributeSets')->setParameter('attributeSets', $attribute); // problem jest z tym fragmentem, zwracane sa poprawne wyniki, ale tylko dla zaznaczonego ostatniego checkboxa z multiselekta
  23. }
  24. }
  25. }


Czy ktos z Was ma jakis pomysl w jaki sposob poprawic zapytanie?

Ten post edytował swiezak 1.03.2016, 14:02:42
Go to the top of the page
+Quote Post
Riggs
post 2.03.2016, 07:27:43
Post #2





Grupa: Zarejestrowani
Postów: 162
Pomógł: 13
Dołączył: 16.06.2007

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


Przecież ten zapis w pętli nadpisze ci bindowaną wartość parametru na ostatni element tablicy... Musiałbyś mieć unikalne nazwy parametrów. Z resztą zrzuć sobie zapytanie poprzez $qb->getQuery()->getSQL() i zobaczysz, że będziesz miał kilka takich samych where.
Go to the top of the page
+Quote Post
Crozin
post 2.03.2016, 08:02:53
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Odstawiając temat Doctrine'a na chwilę, rozwiązanie samo w sobie: http://stackoverflow.com/questions/927724/...utes-in-an-item - przeniesienie tego do ORM-a nie będzie wielce skomplikowane.

PS. Zastanów się od razu czy nie skorzystać z narzędzi typu Apache SOLR, które zdecydowanie lepiej radzą sobie z wyszukiwaniem.
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: 24.04.2024 - 19:01