1

我想给一个Doctrine模型类添加一些属性和方法,这样每次创建这个类的实例时,自动设置一次属性,可以用相关的getter访问,但是这些值并没有存储在数据库,而是根据同一类的其他属性(这些属性存储在数据库中)计算得出。

例如,假设我在 schema.yml 中有这个类 MyModel:

MyModel:
  actAs:
    Timestampable: ~
  tableName: my_model
  columns:
    id:         { type: integer(8), primary: true, notnull: true, autoincrement: true }
    quantity:   { type: decimal(12), scale: 3, notnull: true }
    price:      { type: decimal(12), scale: 3, notnull: true }

通常我需要知道总量,但我不想将其存储在数据库中:我可以这样做

class MyModel extends BaseMyModel
{
  public function getTotalAmount()
  {
    $this->total_amount = $this->getQuantity() * $this->getPrice(); 
  }    
}

然后每次我需要知道总金额时,我就可以打电话给$my_model->getTotalAmount().

但是,我想要这样的东西

class MyModel extends BaseMyModel
{
  public function setTotalAmount()
  {
    $this->total_amount = $this->getQuantity() * $this->getPrice(); 
  }

  public function getTotalAmount()
  {
    return $this->total_amount;
  }
}

并且在创建 MyModel 类的新实例时,例如

$my_model = Doctrine_Core::getTable("MyModel")->find(1);

我希望该setTotalAmount()函数自动执行,因此该total_amount值只计算一次,并且可以使用 来访问,$my_model->getTotalAmount()而不必在每次调用该函数时重新计算它。

有什么建议吗?

4

2 回答 2

1

这是完全错误的:

class MyModel extends BaseMyModel
{
  public function setTotalAmount()
  {
    $this->total_amount = $this->getQuantity() * $this->getPrice(); 
  }

  public function getTotalAmount()
  {
    return $this->total_amount;
  }
}

设置值意味着实际传递一个参数,并更新相关字段。即使您在水合时更新了此类值,但如果您稍后更改此类值并访问,该getTotalAmount怎么办?setTotalAmount每次更新任何东西时都应该打电话吗?没门。

class MyModel extends BaseMyModel
{
  public function getTotalAmount()
  {
    $this->total_amount = $this->getQuantity() * $this->getPrice(); 
  }    
}

这是完全正确的——你得到一个基于两个存储值的值,具有最大的一致性。

于 2012-09-27T14:23:15.797 回答
-1

您可以覆盖对象的构造函数。所以它会是这样的:

class MyModel extends BaseMyModel
{
  private $total_amount = null;

  public function construct()
  {
    $this->setTotalAmount();
  }

  public function setTotalAmount()
  {
    $this->total_amount = $this->getQuantity() * $this->getPrice();
  }

  public function getTotalAmount()
  {
    if (null === $this->total_amount)
    {
      $this->setTotalAmount();
    }

    return $this->total_amount;
  }
}
于 2012-09-27T14:18:12.403 回答