【发布时间】:2012-06-15 03:27:06
【问题描述】:
在 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 模型与Parent 具有BELONGS_TO 关系,则父视图可能如下所示:
<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 模型代码中做些什么来实现这一点,或者我应该以不同的方式考虑这一点?
【问题讨论】:
-
我刚刚看到 Yii 也有一个 Named Scopes 的实现。所以我正在阅读。它可能会为我指明正确的方向。
标签: php activerecord model yii virtual-attribute