sql >> Databasteknik >  >> RDS >> Mysql

QueryBuilder/Doctrine Välj gå med i grupp

Jag antar att du bara behöver dessa fält och inte dina AdminGoals entitet. På ditt AdminGoalsRepository du kan göra något så här:

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();
}

Tänk på att returobjektet kommer att vara en array av rader, varje rad är en associerad array med nycklar som mappningarna ovan.

Redigera

Efter att ha uppdaterat frågan kommer jag att ändra min föreslagna funktion men kommer att lämna exemplet ovan om andra skulle vilja se skillnaden.

Först till kvarn, eftersom detta är en enkelriktad ManyToOne mellan AdminSavings och AdminGoals , ska den anpassade frågan finnas i AdminSavingsRepository (inte som ovan ). Dessutom, eftersom du vill ha ett aggregerat fält detta kommer att "bryta" en del av dina data hämtas. Försök att hålla så mycket OOP när du inte bara renderar mallar.

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. SQL-fråga som jämför ett attribut i flera tuplar baserat på värden för ett annat attribut inom relationen

  2. Vad betyder det med att välja 1 från tabellen?

  3. skapa primära och främmande nyckelrelationer

  4. MySQL Ändra tabell Lägg till fält före eller efter ett fält som redan finns