2013-05-30 29 views
5

Pracuję z Symfony 1.4 i Doctrine. Piszę aplikację o niektórych pubów/barów, a ja mam 4 tabel:Jak uzyskać wynik DQL z szablonu z symfony 1.4?

  • produkty
  • zlecenia
  • product_order
  • puby.

Chcę uzyskać czasy, w których wszystkie produkty zostały zamówione w pierwszym pubie (np. Pubs.id = 1). To jest to, co mam, ale mogę uzyskać tylko sumę pierwszego produktu (products.id = 1) i potrzebuję sumy wszystkich z nich, w tym przypadku są dwa różne produkty w mojej db.

ProductOrderTable:

public function ordersGetCount(){ 

    $q = Doctrine_Query::create() 

     ->from('ProductOrder l') 
     ->innerJoin('l.Order p ON l.id_order = p.id') 
     ->select('SUM(l.amount) as units') 
     ->andWhere('p.id_pub = 1') 
     ->groupBy('l.id_product') 
     ->orderBy('p.id'); 
    return $q->execute(); 
} 

Oto moja klasa działanie:

$this->resultCount= Doctrine_Core::getTable('productorder')->ordersGetCount(); 

I tu mój szablon:

for($i=0; $i<2; $i++){ 

      echo "<tr>"; 

      echo "<td>".$resultCount[0]->getUnits()[$i]."</td>";// 
      echo "<td>1</td>"; 
      echo "<td>1</td>"; 
      echo "</tr>"; 


     } 

Proszę potrzebuję pomocy :)

+0

Przepraszam, ale ... czy możesz wyjaśnić trochę lepiej swój problem? – ilSavo

+0

Chcę uzyskać sumę (l.amount) każdego produktu.zapytanie działa, myślę, ale nie wiem jak przejść przez "$ resultCount-> getUnits()" – user2294971

Odpowiedz

1

Myślę, że nie ma nic złego w zapytaniu, ale powinieneś rzucić okiem na sposób wyświetlania wyników.

echo "<td>".$resultCount[0]->getUnits()[$i]."</td>"; 

Po pierwsze, jesteś zawsze odnosząc się do pierwszego elementu w tablicy $resultCount. Po drugie, nie jestem pewien, czy można użyć getter dla kolumny wirtualnym (nie używasz kolumnę, który jest mapowany do modelu

Więc pójdę z czymś takim.

  1. W ordersGetCount użyłbym

    return $q->fetchArray(); 
    

    To zwróci tablicę tablic, a nie tablicę obiektów i pozwoli na dostęp do kolumny wirtualny units.

  2. Aby wyświetlić wyniki:

    <?php foreach ($resultCount as $row): ?> 
        <tr> 
         <td> 
          <?php echo $row['units']; ?> 
         </td> 
         <td>1</td> 
         <td>1</td> 
        </tr> 
    <?php endforeach ?> 
    

EDIT:

Jest to dość dziwne;) można spróbować zbudować kwerendę w ten sposób: (w teorii powinny być takie same):

$q = $this->createQuery('l') 
    ->select('l.id_product, sum(l.amount) as units') 
    ->innerJoin('l.Order') 
    ->where('p.id_pub = 1') 
    ->groupBy('l.id_product') 
    ->orderBy('p.id'); 
+0

Dzięki za odpowiedź Michał, znalazłem funkcja wypróbowania SQL i nie jest to problem, który działa dobrze, próbowałem twojej sugestii, ale wypisuje tylko jeden rekord, który musi wydrukować 2, jeśli próbuję uzyskać dostęp ręcznie do drugiego rekordu (resultCount [1] ['units']) mówi Undeffined offset 1. Więcej sugestii proszę im się wściekam :( – user2294971

+1

Czy uruchomiłeś kwerendę z bazą danych i absolutnie upewnić się, że powinien zwrócić dwa wiersze? Czy masz dwa różne produkty związane z 'id_pub = 1'? –

+0

100% pewności, phpmyadmin zwraca 2 wiersze – user2294971

0

musisz spróbować usunąć

->groupBy('l.id_product') 

redukuje wyniki do jednego produktu.

+0

dzięki za odpowiedź, chcę uzyskać wszystkie produkty :) – user2294971