Yii では、モデルの結果セットに「派生」列を追加する必要があります。列は実際にはデータベース テーブルに存在しません。
たとえば、Activity
モデルがあるとします。活動には、(1) 収入、または (2) 支出の 2 種類しかありません。
income_total
orという列を追加したい場合(アクセスされているアクティビティの種類expense_total
に応じて)、どのようにすればよいでしょうか?
以下は、Ruby on Rails でのモデルの実例Activity
です (基本的に、同じことを Yii で行う方法を考えています)。
class Activity < ActiveRecord::Base
attr_accessible :name, :effective_at, :amount, :category
scope :incomes, :conditions => { :category => 'Income' }
scope :expenses, :conditions => { :category => 'Expense' }
def self.incomes_total
incomes.sum :amount
end
def self.expenses_total
expenses.sum :amount
end
end
2012 年 7 月 1 日更新:
Leonardo が提供した回答は、Virtual Attributesの使用を指しています。これにより、データベースから取得している結果セットの各「行」に属性が追加されます。
Activity
モデルに とのBELONGS_TO
関係がある場合Parent
、親ビューは次のようになります。
<h2><?php echo $parent->name; ?></h2>
<ul>
<?php foreach($portfolio->activities as $activity): ?>
<li>
<?php echo CHtml::link($activity->name, array('activity/view', 'id' => $activity->id)); ?>
<?php echo $activity->amount; ?>
<?php echo $activity->incomes_total; ?>
</li>
<?php endforeach; ?>
</ul>
ただし、この仮想属性が foreach() ループ内でアクセスされるのは意味がありません。
私が望むこれらの仮想属性は、結果セット全体に対して 1 つの「集約された」値を提供するため、次の$parent->activities->incomes_total
ように を使用してアクセスできるようにしたいと考えています。
<h2><?php echo $parent->name; ?></h2>
<?php echo $parent->activities->incomes_total; ?>
<ul>
<?php foreach($portfolio->activities as $activity): ?>
<li>
<?php echo CHtml::link($activity->name, array('activity/view', 'id' => $activity->id)); ?>
<?php echo $activity->amount; ?>
</li>
<?php endforeach; ?>
</ul>
これを達成するには、Activity モデル コード内で何をする必要がありますか、それとも別の方法で考えるべきですか?