Witam,
tworzę właśnie projekt w Symfony 4 i mam w bazie danych utworzoną tabelę (screen w załączniku) i chciałbym w repozytorium utworzyć funkcję, która przyjmuje id produktu zwracając wiersze tabeli, które reprezentują najniższą wartość dla każdego sklepu. Napisałem taki kod:
public function findSmallestPrices($productId)
{
return $this->createQueryBuilder('p')
->select('p, MIN(p.price) AS min_price')
->where('p.product = :val')
->setParameter('val', $productId)
->groupBy('p.store')
->orderBy('min_price', 'ASC')
->setMaxResults(10)
->getQuery()
->getResult()
;
}
Wszystko byłoby tak jak należy gdyby funkcja ta zwracała cały wiersz z najmniejszą ceną, a zamiast tego dostaję 4 (bo mam 4 różne sklepy) tablice 2 wymiarowe gdzie pod indeksem "0" każdej z nich mam pierwszy zapisany wiersz tej encji z danego sklepu, natomiast pod indeksem "1" wartość najniższej ceny dla danego sklepu. Wiem że wartość najniższą potem można ukryć za pomocą AS HIDDEN, lecz nie rozumiem dlaczego polecenie oderBy (czy to min_price czy p.price) działa sortując kolejność wypisywania samych grup a nie pól wewnątrz nich?? Próbowałem też osiągnąć swój cel za pomocą polecenia:
->having('p.price < 100')// domyślnie chciałbym by tu była formuła (p.price == min_price), lecz wyczytałem że w doctrine nie można korzystać z wartości wyciągniętych za pomocą selecta w poleceniu having i where
Zamiast selecta i orderBy lecz dla wartości mniejszych niż 100 zwraca mi pustą listę a dla większych niż 100 ten sam wynik co za pomocą pierwszego kodu. Póki co tymczasowo zrobiłem funkcję która pobiera id produktu i sklepu przeszukuje bazę danych zwracając wiersz dla danego produktu i sklepu i uruchamiam ją w pętli dla każdego sklepu osobno, lecz wiem, że to niezbyt "czyste" rozwiązanie, a mimo wszystko chciałbym, aby uczyć się pisać jak najbardziej optymalny kod. Czy ktoś jest w stanie wytłumaczyć mi błąd mojego rozumowania i nakierować na dobrą drogę??
Za pomoc z góry dziękuje.