4

Yii では、モデルの結果セットに「派生」列を追加する必要があります。列は実際にはデータベース テーブルに存在しません。

たとえば、Activityモデルがあるとします。活動には、(1) 収入、または (2) 支出の 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 年 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 モデル コード内で何をする必要がありますか、それとも別の方法で考えるべきですか?

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_idamount同様に、属性名を変更してください

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