2012-06-15 50 views
4

在Yii中,我需要爲我的模型的任何結果集添加一個「派生」列。該列實際上不存在於數據庫表中。如何將派生列添加到我的Yii模型?

例如,假設我有一個Activity模型。只有兩種類型的活動:(1)收入,或(2)支出。

如果我想添加一個名爲income_totalexpense_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> 

什麼我需要做的內活動模型代碼來實現這一點,還是我應該考慮這個不同的方式?

+0

我剛剛看到Yii有一個實施[命名範圍](http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes)也是如此。所以我正在閱讀。它可能指向我正確的方向。 – Turgs

回答

3

我相信它和Ruby很相似。 PHP有一些神奇的方法,它們在Yii中由CComponent(許多基類包括CActiveRecord)實現。

總之你可以在你的模型

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

內做這做,從控制器

$activity = Activity::model->findByPk(1); 
$income_total = $activity->income_total; 
+0

我不知道這可以做到。大。 Yii稱之爲「[虛擬屬性](http://www.yiiframework.com/wiki/167/understanding-virtual-attributes-and-get-set-methods/#hh0)」 – Turgs

+0

這有助於虛擬屬性是特定的對於每個CActiveRecord實例,但是我需要跨整個結果集的虛擬屬性。我已經更新了這個問題以反映這個細節。 – Turgs

0

訪問它,我不知道如何能在模型內進行。

雖然更多的處理,選項或解決辦法是另一個foreach()循環添加到視圖,像這樣:

$incomes_total = 0; 
foreach($parent->activities as $activity) 
    $incomes_total += $activity->amount; 
echo $incomes_total; 
0

正如我張貼在other answer您可以簡單地用一個統計關係。指定父模型中的STAT關係作爲

'incomes_total'=>array(self::STAT, 'Activity', 'parent_id','select'=>'SUM(amount)','condition'=>"incomes_total.category='Income'") 

Similiarly

'expense_total'=>array(self::STAT, 'Activity', 'parent_id','select'=>'SUM(amount)','condition'=>"incomes_total.category='Expense'") 

注:更改屬性名parent_idamount作爲模型

+0

我試着玩它,但我需要這個在Activity模型中而不是在Parent模型中,這樣在Activity的actionIndex()視圖中,我也可以在那裏獲取總數。 – Turgs

+0

@Turgs我不清楚你說了什麼。請詳細說明你想要什麼,這樣我可以編輯我的答案 – dInGd0nG

+0

而不是把STAT關係放在父模型中,我需要它在Activity模型中以某種方式定義。幾乎就像一個STAT關係本身。也就是說,我不喜歡這種STAT關係如何觸發單獨的數據庫查詢。我最終會喜歡使用已經檢索的所有數據的方式。 – Turgs

相關問題