2012-08-07 30 views
7

我在Yii有一個日曆應用程序,用於存儲每個用戶的事件。我想動態地爲每個事件建立一個標題。Yii CDbCriteria和Model-> findAll,如何添加自定義列?

此代碼是在我的控制器:

$criteria = new CDbCriteria; 
$criteria->select = array('all_day','end','id','start'); 
$criteria->condition = 'user_id ='.$user->id; 
$events = Calendar::model()->findAll($criteria); 
foreach($events as $event) { 
    $event->title = 'test title'; 
} 
echo CJSON::encode($events); 

在我的日曆模式,我添加了一個名爲$標題的新屬性:

public $title; 

但後來當我去呼應JSON ,標題不顯示...

[{"all_day":false,"end":"-948712553","id":"2","start":"-146154706"}] 

我需要做什麼才能將標題添加到JSON結果集?

+0

,所以你最終要的是這樣的:'{「稱號」:「測試題」,「ALL_DAY」:假的,「結束「:」 - 948712553「,」id「:」2「,」start「:」 - 146154706「}'? – 2012-08-07 21:47:40

+0

這是正確的。 – ews2001 2012-08-07 21:56:21

回答

4

這是因爲CJSON::encode編碼屬性各自模型的,和自定義屬性不被添加到模型的屬性。自定義屬性添加到模型的方式,這不能以直接的方式完成。

我沒有拿出一個解決辦法,雖然從this answer服用提示:

$events = Calendar::model()->findAll($criteria); 
$rows=array();// we need this array 
foreach($events as $i=>$event) { 
    $event->title = 'test title'; 
    $rows[$i]=$event->attributes; 
    $rows[$i]['title']=$event->title; 
} 

echo CJSON::encode($rows); // echo $rows instead of $events 

上面的代碼應該工作。

+0

這是在每行的末尾添加「title」,但是如果你願意的話,你可以使用更多的代碼將它添加到每行的開頭。 – 2012-08-07 22:00:25

+1

非常好,謝謝! – ews2001 2012-08-07 22:00:28

+0

不客氣,總是樂於幫忙 – 2012-08-07 22:01:23

4

你可以擴展你的模型,並提供你這樣的新屬性:

public function getTitle() { 
     return "test title"; 
    } 

    public function getAttributes($names = true) { 
     $attrs = parent::getAttributes($names); 
     $attrs['title'] = $this->getTitle(); 

     return $attrs; 
    } 
+0

這應該就是答案!謝謝! – 2014-01-08 12:30:18

+0

但不會永久保持該屬性設置爲'測試標題'?我如何將屬性設置爲其他內容? – 2014-11-24 14:46:50

+0

創建一個setter,如setTitle($ title)函數。 – Prashant 2015-02-10 08:54:13