sql >> データベース >  >> RDS >> Mysql

QueryBuilder / Doctrine Select join groupby

    AdminGoalsではなく、このフィールドのみが必要であると想定します。 実在物。 AdminGoalsRepository 次のようなことができます:

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

    戻りオブジェクトは行の配列であり、各行は上記のマッピングのようなキーに関連付けられた配列であることに注意してください。

    編集

    質問を更新した後、提案された機能を変更しますが、他の人が違いを確認したい場合は、上記の例を残します。

    まず最初に、これはAdminSavings間の単方向のManyToOneであるためです。 およびAdminGoals 、カスタムクエリはAdminSavingsRepositoryにある必要があります (上記とは異なります )。また、集約フィールド が必要なため これは「壊れる」 データフェッチの一部。テンプレートをレンダリングするだけではない場合は、できるだけ多くのOOPを維持するようにしてください。

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

    ボーナス

    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. MariaDBで日付に日を追加する8つの方法

    2. UUIDをRAW(16)列に挿入する方法

    3. MySQL-Max()が間違った結果を返す

    4. PostgreSQLのパフォーマンスの監視と監査-トップリソース