0

我对如何为我的实体添加功能感到困惑。

假设我有一张费用增加表。我的数据库表有这些字段

  • company_id
  • 日期
  • 数量

我已经FeeIncrease在我的 Symfony2 项目中创建了相应的实体。

现在,对于我的应用程序的一部分,我需要显示HTML一个特定月份发生的所有费用增加的表格。该表将包含数据库表中的所有字段,但还将包含一个附加字段:先前的费用金额。像这样的东西:

company_id | date       | amount | previous_amount
-----------+------------+--------+----------------
1          | 2013-02-03 | 500    | 400
3          | 2013-02-15 | 1000   | 800
8          | 2013-02-20 | 1100   | 500

从数据库的角度考虑,每一行都需要一个从表中选择最新费用增加的子查询(即,它查询当前增加日期之前的最新日期的费用增加)。

目前我正在使用Native SQL编写子查询,但业务逻辑的复杂性已经表明这不是一个长期的解决方案。不同的页面需要不同的“where”子句,所以我将为每个页面编写一个新查询。此外,还有更多逻辑需要应用于字段本身,我更愿意将此逻辑封装在其他对象中,而不是像现在这样让它漂浮在我的控制器和视图周围。

我的问题本质上是,如何向我的实体添加依赖于实体数据的额外属性?

理想情况下,我会向我的实体添加一个$previousAmount属性。将是一种为我进行复杂查询的方法。但是我怎样才能添加这个方法并让它利用 Doctrine 的功能呢?例如,假设我用来获得一系列费用增加。然后,在我的模板中,我遍历数组,但是对于每次费用增加,我都会显示之前的金额:FeeIncreasegetPreviousAmount->findAll()

{% for feeIncrease in feeIncreases %}
  {{ feeInrease.previousAmount }}
{% endfor %}

对于每次增加,这将导致另一个数据库调用。考虑到我想显示的费用增加次数,这在我的情况下是不可用的。

任何指针将不胜感激。

更新:

这是我正在谈论的一个例子。

我上面描述的费用增加与合同有关。每份合同都有很多费用增加。每个月,每份合约都有一个“当前”费用,由以下规则确定:

  • 如果合同从该月开始有新的费用增加,请使用该金额。
  • 如果一份合同在该月结束时增加了费用,而不是后续的另一份,则使用该金额。

还有其他规则。所以我的问题是,我可以把这些规则放在哪里,这样当我实际使用我的contractfeeIncrease对象时,我可以使用类似的方法,contract.currentFee而不必在任何地方添加所有这些逻辑?

4

1 回答 1

0

您可以使用与您的实体耦合的存储库:这样您就可以将所有 sql(或 DQL 或查询构建器)保存在同一个地方,甚至可以对其进行参数化。
这种方法的一个优点是您甚至可以使用相同的查询获取所有数据,并将返回的值使用到 twig 模板中,而无需对教义的延迟加载工具进行检索操作。

所以你会有一个像FeeIncrease

/**
* @ORM\Table(name="FeeIncrease")
* @ORM\Entity(repositoryClass="Company\BundleNameBundle\Repository\FeeIncreaseRepository")
*/

class FeeIncrease
{
  [...]
}

在其中指定存储库位置,然后以这种方式创建存储库

//Company\BundleNameBundle\Repository\FeeeIncreaseRepository
<?php

namespace Company\BundleNameBundle\Repository;

use Doctrine\ORM\EntityRepository;

/**
 * FeeIncreaseRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */

class FeeIncreaseRepository extends EntityRepository
{
  public function myCostumQuery($paramers)
  {
    //your own logic here
  }
}
于 2013-04-17T08:26:53.327 回答