Mysql
 sql >> Baza danych >  >> RDS >> Mysql

QueryBuilder/Doctrine Wybierz dołącz do groupby

Zakładam, że potrzebujesz tylko tych pól, a nie swoich AdminGoals podmiot. W Twoim AdminGoalsRepository możesz zrobić coś takiego:

public function getGoalsByUser(User $user) 
{
    $qb = $this->createQueryBuilder('goal');
    $qb->select('SUM(savings.value) AS savings_value')
       ->addSelect('goal.created')
       ->addSelect('goal.description')
       ->addSelect('goal.goalDate')
       ->addSelect('goal.value')
       ->addSelect('goal.budgetCat') //is this an entity? it will be just an ID
       ->join('goal.adminSavings', 'savings', Join::WITH))
       ->where($qb->expr()->eq('goal.user', ':user'))
       ->groupBy('goal.id')
       ->setParameter('user', $user);

    return $qb->getQuery()->getScalarResult();
}

Pamiętaj, że obiekt zwracany będzie tablicą wierszy, każdy wiersz jest powiązaną tablicą z kluczami, takimi jak powyższe mapowania.

Edytuj

Po zaktualizowaniu pytania zamierzam zmienić sugerowaną funkcję, ale zostawię powyższy przykład, jeśli inne osoby chciałyby zobaczyć różnicę.

Po pierwsze, ponieważ jest to jednokierunkowe ManyToOne między AdminSavings i AdminGoals , zapytanie niestandardowe powinno znajdować się w AdminSavingsRepository (nie jak powyżej ). Ponadto, ponieważ potrzebujesz pola zagregowanego to „złamie się” niektóre z Twoich danych są pobierane. Staraj się zachować jak najwięcej OOP, gdy nie tylko renderujesz szablony.

public function getSavingsByUser(User $user)
{
    $qb = $this->createQueryBuilder('savings');
    //now we can use the expr() function
    $qb->select('SUM(savings.value) AS savings_value')
       ->addSelect('goal.created')
       ->addSelect('goal.description')
       ->addSelect('goal.goalDate')
       ->addSelect('goal.value')
       ->addSelect('goal.budgetCat') //this will be just an ID
       ->join('savings.goal', 'goal', Join::WITH))
       ->where($qb->expr()->eq('goal.user', ':user'))
       ->groupBy('goal.id')
       ->setParameter('user', $user);

       return $qb->getQuery()->getScalarResult();
}

Bonus

public function FooAction($args) 
{
    $em = $this->getDoctrine()->getManager();
    $user = $this->getUser();
    //check if user is User etc depends on your config
    ...

    $savings = $em->getRepository('AcmeBundle:AdminSavings')->getSavingsByUser($user);

    foreach($savings as $row) {
        $savings = $row['savings_value'];
        $goalId =  $row['id'];  
        $goalCreated = $row['created'];
        [...]
    }
    [...]
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wywołać procedurę składowaną mysql z argumentami z wiersza poleceń?

  2. Unikalny BLOB MySQL / MariaDB o stałej długości

  3. Otrzymywanie nieznanego błędu kolumny podczas używania „as” w instrukcji mysql

  4. Czy mogę użyć podzapytania w instrukcji INSERT?

  5. Jak zbudować metodę hybrid_method zliczającą liczbę rekordów z ostatnich X dni?