Symfony2 添加 属性 到对象

Symfony2 add property to object

这是一个延续另一个话题的问题:

请打开它以便您可以看到数据库架构。

我的问题是:

我有一个目标,一个目标有很多储蓄。

这意味着如果您想为某个目标存钱,您会增加一些储蓄,因此储蓄会link按 ID 计入目标。

在那个话题中,有人谈到了储蓄和目标之间的单向 link,(我有 goal_id 的储蓄 table,但没有 saving_id 的目标table).

我想做的是显示一个带有目标信息的 table 并向其附加一个收集的值(不在数据库中)这个值是所有保存值的总和 link 目标:

例如:

  Goals:
  id: 1
  goal name: Goal1
  ....

  Savings:
  id: 1
  amount:10
  goal_id: 1

  id:2
  amount:20
  goal_id: 1

当我查询数据库时,我会得到一个 table,其中包含目标信息和一个字段 Amount Collected: 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

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

Goals 和 Savings 之间唯一的 link 是 Savings table 中的 goal_id,这意味着使用查询构建器我必须从 Savings table 开始.. 因为从目标 table 我没有 foreign_key 储蓄。

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

首先您创建目标,然后创建储蓄。但是因为储蓄中没有记录 table(我从)我没有从目标中得到任何东西 table 因为我加入了这两个 tables.

 $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 对象中。这是在我的控制器中

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 对象中,我以这个为例,我想以某种方式在 $goal 对象中插入那个 savingSum .

我不想在实体中创建另一个字段并进行设置,因为那样的话我在数据库中会有一个空列,我不想那样..我想保留我的结构tables 和实体,并且只将所有储蓄金额的总和添加到目标 table。

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

  {% 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 %}

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

如果您对如何以 symfony 方式执行此操作有更好的想法..我总是可以 运行 rawquery 并且它会起作用,但这不是我想做的..必须有一个以 OOP 方式执行此操作的方法..请帮助。

谢谢!

I don't want to create another field in the entity and set that, because then I would have a empty collumn in the database

不必将字段映射到数据库,可以是普通的class字段