Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

QueryBuilder / Doctrine Chọn tham gia groupby

Tôi giả định rằng bạn chỉ cần các trường này chứ không cần AdminGoals của bạn thực thể. Trên AdminGoalsRepository của bạn bạn có thể làm điều gì đó như sau:

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

Hãy nhớ rằng đối tượng trả về sẽ là một mảng các hàng, mỗi hàng là một mảng được liên kết với các khóa giống như các ánh xạ ở trên.

Chỉnh sửa

Sau khi cập nhật câu hỏi, tôi sẽ thay đổi chức năng được đề xuất của mình nhưng sẽ để lại ví dụ trên nếu người khác muốn thấy sự khác biệt.

Điều đầu tiên trước tiên, vì đây là ManyToOne đơn hướng giữa AdminSavingsAdminGoals , truy vấn tùy chỉnh phải nằm trong AdminSavingsRepository ( không giống như trên ). Ngoài ra, vì bạn muốn có một trường tổng hợp cái này sẽ "phá vỡ" một số dữ liệu của bạn đang tìm nạp. Cố gắng duy trì OOP nhiều nhất khi bạn không chỉ hiển thị các mẫu.

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

Tiền thưởng

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. tải xuống ảnh chụp nhanh RDS

  2. Khi nào tôi gọi bind_param nếu sử dụng các câu lệnh được chuẩn bị sẵn trong MySQLi trong một vòng lặp?

  3. Menu đệ quy PHP trong cấu trúc danh sách HTML

  4. chèn các giá trị từ danh sách thả xuống vào bảng cơ sở dữ liệu

  5. Đề xuất sao lưu trang web php và db mysql