在Yii中,我需要为我的模型中的任何结果集添加一个“派生”列。该列实际上并不存在于数据库表中。
例如,假设我有Activity
模型。活动只有两种:(1)收入,或(2)费用。
如果我想添加名为income_total
或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-07-01:
answer provided by 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()循环中访问此虚拟属性没有意义。
我想要的这些虚拟属性为整个结果集提供一个“聚合”值,因此我希望能够使用$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模型代码中做些什么来实现这一点,或者我应该以不同的方式考虑这个问题?
答案 0 :(得分:3)
我相信它与Ruby非常相似。 PHP有魔术方法,在Yii中由CComponent实现(很多基类包括CActiveRecord)。
简而言之,您可以在模型中执行此操作
class Activity extends CActiveRecord {
public function getIncome_Total() {
// ...
}
}
并且,从控制器
访问它$activity = Activity::model->findByPk(1);
$income_total = $activity->income_total;
答案 1 :(得分:0)
我不知道如何在模型中完成这项工作。
虽然处理更多,但选项或解决方法是向View添加另一个foreach()
循环,如下所示:
$incomes_total = 0;
foreach($parent->activities as $activity)
$incomes_total += $activity->amount;
echo $incomes_total;
答案 2 :(得分:0)
当我在other answer发布时你可以简单地使用统计关系。在父模型中指定STAT关系为
'incomes_total'=>array(self::STAT, 'Activity', 'parent_id','select'=>'SUM(amount)','condition'=>"incomes_total.category='Income'")
熟悉
'expense_total'=>array(self::STAT, 'Activity', 'parent_id','select'=>'SUM(amount)','condition'=>"incomes_total.category='Expense'")
注意:更改模型中的属性名称parent_id
和amount