sql >> Databáze >  >> RDS >> Mysql

QueryBuilder/Doctrine Vyberte připojení ke skupině

Budu předpokládat, že potřebujete pouze tato pole a ne AdminGoals entita. Na vašem AdminGoalsRepository můžete udělat něco takového:

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

Mějte na paměti, že návratovým objektem bude pole řádků, každý řádek je přidružené pole s klíči, jako jsou výše uvedená mapování.

Upravit

Po aktualizaci otázky změním svou navrhovanou funkci, ale opustím výše uvedený příklad, pokud by ostatní chtěli vidět rozdíl.

Za prvé, protože se jedná o jednosměrný ManyToOne mezi AdminSavings a AdminGoals , vlastní dotaz by měl být v AdminSavingsRepository (ne jako výše ). Také, protože chcete agregované pole to se "rozbije" načítání některých vašich dat. Snažte se zůstat co nejvíce OOP, když nevykreslujete pouze šablony.

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. Migrace dat z MySQL do elasticsearch v reálném čase?

  2. JSON_LENGTH() – Vrátí délku dokumentu JSON v MySQL

  3. Typy Oracle SQL přes dblink

  4. Získejte hodnoty z chráněného majetku