1

Doctrineモデルクラスにいくつかのプロパティとメソッドを追加して、このクラスのインスタンスが作成されるたびに、プロパティが自動的に一度設定され、関連するゲッターでアクセスできるようにしたいのですが、これらの値はに保存されません。データベースではなく、同じクラスの他のプロパティ(これらはdbに格納されている)から計算されます。

たとえば、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()ので、値は1回計算され、関数が呼び出されるたびに再計算することなく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(); 
  }    
}

これは完全に正しいです-最大の一貫性で、2つの保存された値に基づいて値を取得します。

于 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 に答える