Symfony2将属性添加到对象



这是一个继续另一个主题的问题:

QueryBuilder/Doctrine按选择加入组

请打开它,这样你就可以在那里看到数据库架构。

我的问题是:

我有一个目标,一个目标可以节省很多钱。

这意味着,如果你想为一个目标省钱,你会增加一些储蓄,所以这些储蓄通过id与目标联系起来。

在那个主题中,有人谈到了储蓄和目标之间的单向联系,(我在储蓄表中有goal_id,但在目标表中没有saving_id)。

我想做的是显示一个包含目标信息的表,并在其上附加一个收集的值(不在数据库中)这个值是链接到目标的所有保存值的总和:

例如:

  Goals:
  id: 1
  goal name: Goal1
  ....
  Savings:
  id: 1
  amount:10
  goal_id: 1
  id:2
  amount:20
  goal_id: 1

当我查询数据库时,我会得到一个包含目标信息的表和一个字段AmountsCollected:30。

我最初设法进行了查询,得到了这个:

    select 
    admin_goals.created,
    admin_goals.description,
    admin_goals.goal_date,
    admin_goals.value,
    admin_goals.budget_categ,
    sum(admin_savings.value) 
    from admin_goals 
inner join admin_savings on admin_savings.goal_id=admin_goals.id 
    where admin_goals.user_id=1 
    group by admin_goals.id

但我想用符号的方式,所以我使用了查询生成器,创建了一个存储库,但没有得到相同的结果。

Goals和Savings之间的唯一链接是Savings表中的goal_id,这意味着使用查询生成器我必须从Savings表开始。。因为在目标表中,我没有可以节省的外键。

但现在的问题是,因为我从储蓄表开始,当显示目标时,我得到一个空的结果,这是因为最初目标没有储蓄。

首先创建"目标",然后创建"节省"。但是因为Savings表中没有记录(我从中开始),所以我没有从Goals表中得到任何信息,因为我在这两个表上有一个联接。

 $qb = $this->createQueryBuilder('admin_savings');
        $qb->select('SUM(admin_savings.value) AS savingValue')
            ->addSelect('admin_goals.id AS id')
            ->addSelect('admin_goals.created')
            ->addSelect('admin_goals.description')
            ->addSelect('admin_goals.goal_date')
            ->addSelect('admin_goals.value')
            ->addSelect('admin_budget.name') //    daca vrei id atunci pune identity(admin_goals.categ_id)                          admin_budget.name, x.name
            ->join('admin_savings.goal_id', 'admin_goals', Join::WITH)
            ->join('admin_goals.budget_categ', 'admin_budget', Join::WITH) //parametru 2 e numele de referinta in selectul mare ex: admin_budget, putea fi x
        ->where($qb->expr()->eq('admin_goals.user_id', ':user'))
        ->groupBy('admin_goals.id')
        ->setParameter('user', $user);

我知道这是不可能的,所以我尝试了另一种方法,为什么我不正常地查询目标实体,因为这是我想看到的。。

$repository = $this->getDoctrine()->getRepository('AppBundle:Goal');
 $goals = $repository->findBy(array('user_id' => $userId));

我在我的SavingsRepository中做了一个函数:

public function getSavingSumByGoal($goalId){
        $qb = $this->createQueryBuilder('saving');
        $qb->select('SUM(saving.value) AS savingValue')
            ->where($qb->expr()->eq('saving.goal_id', ':goal'))
            ->setParameter('goal', $goalId);
        return $qb->getQuery()->getScalarResult();
    }

所以现在我有了Goals实体及其所有信息,但没有从储蓄中收集的金额总和,我需要以某种方式将其添加到我的$Goals对象中。这是在我的控制器中

foreach($goals as $goal_item){
            $savingSum=$SavingRepository->getSavingSumByGoal($goal_item->getId());
            if($savingSum){
                $goal_item->savingSum=$savingSum;
            }else{
                $goal_item->savingSum=0.00;
            }
        }

$goal_item->savingSum是一个虚构的属性,他不存在于$goal对象中,我举了一个例子,我想以某种方式将该savingSum插入$goel对象中。

我不想在实体中创建另一个字段并设置它,因为那样我在数据库中就会有一个空的collmn,我不希望这样。。我想保留我的表和实体的结构,只在目标表中添加目标的所有节省金额之和。

但它不起作用。我在想以某种方式执行我的功能,但我认为这不是一个好主意。

  {% for goal in goals %}
    <tr style="">
       <td>{{ goal.created|date('Y/m/d')  }}</td>
       <td>{{ goal.description|e }}</td>
       <td>{{ goal.value|e }}</td>
       <td>{{ goal.goal_date|date('Y/m/d') }}</td>
       <td>{{ goal.name|e }}</td>
       <td>{{ savingRepo->getSavingSumByGoal(goal.id)|e }} </td>
        </td>
      </tr>
{% endfor %}

这是一种糟糕的做法,在trick中不起作用,但我知道人们在Zend和其他框架中使用了这种方法(在你制作foreach()之后,你在当前对象(来自foreach)id上运行你的函数,并显示基于此的东西)

如果你对如何用符号的方式做这件事有更好的想法。。我总是可以运行rawquery,它会起作用,但这不是我想做的。必须有一种方法以OOP的方式来做到这一点。。请帮忙。

谢谢!

我不想在实体中创建另一个字段并设置它,因为那样我会在数据库中有一个空的collmn

您不必将字段映射到数据库,它可以是普通类字段

相关内容

  • 没有找到相关文章

最新更新