4

在 Yii 中,我需要在我的模型中的任何结果集中添加一个“派生”列。该列实际上并不存在于数据库表中。

例如,假设我有一个Activity模型。只有两种类型的活动:(1)收入,或(2)费用。

如果我想添加一个名为income_totalor的列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 更新:

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 模型代码中做什么来实现这一点,或者我应该以不同的方式思考这个问题?

4

3 回答 3

3

我相信它与 Ruby 非常相似。PHP 有魔术方法,在 Yii 中由 CComponent(包括 CActiveRecord 在内的许多基类)实现。

简而言之,您可以在模型中执行此操作

   class Activity extends CActiveRecord {
     public function getIncome_Total() {
       // ...
     }
   }

并且,从控制器访问它

$activity = Activity::model->findByPk(1);
$income_total = $activity->income_total;
于 2012-06-15T04:24:18.843 回答
0

正如我在另一个答案中发布的那样,您可以简单地使用统计关系。将父模型中的 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在您的模型中

于 2012-07-02T09:05:04.210 回答
0

我不知道如何在模型中做到这一点。

尽管处理更多,但一个选项或解决方法是向foreach()视图添加另一个循环,如下所示:

$incomes_total = 0;
foreach($parent->activities as $activity)
  $incomes_total += $activity->amount;
echo $incomes_total;
于 2012-07-02T06:15:14.573 回答