sql >> Database teknologi >  >> RDS >> Mysql

QueryBuilder/Doctrine Vælg Deltag i gruppeaf

Jeg vil antage, at du kun har brug for disse felter og ikke dine AdminGoals enhed. På dit AdminGoalsRepository du kan gøre noget som dette:

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

Husk, at returobjektet vil være en række rækker, hver række er en tilknyttet matrix med nøgler som tilknytningerne ovenfor.

Rediger

Efter at have opdateret spørgsmålet, vil jeg ændre min foreslåede funktion, men vil forlade ovenstående eksempel, hvis andre mennesker gerne vil se forskellen.

Først og fremmest, da dette er en ensrettet ManyToOne mellem AdminSavings og AdminGoals , skal den tilpassede forespørgsel være i AdminSavingsRepository (ikke som ovenfor ). Også, da du ønsker et aggregeret felt dette vil "brud" henter nogle af dine data. Prøv at forblive så meget OOP, når du ikke kun gengiver skabeloner.

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. Ved hjælp af sql/plsql, hvordan finder du ud af, hvilket tegnsæt en tekst bruger?

  2. Vis poster fra to tabeller side om side, der kun matcher nogle af felterne

  3. Er der en MySQL-ækvivalent til PHP's preg_replace?

  4. Sådan laver du et nyt felt i tabellen, når brugeren klikker på et link