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 AdminSavings
và AdminGoals
, 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'];
[...]
}
[...]
}