2011-03-24 23 views
4

我有一些代碼檢查參數,並調用對等方法從數據庫中獲取項目。symfony - 從動作中的對等方法調用返回JSON

我需要得到的是JSON中的這些項目。

我同行的方法是這樣的:

public static function searchFromRequest($word) 
{ 
    $c = new Criteria(); 
    $c->addJoin(self::ARTICLE_ID, ArticlePeer::ID); 
    $c->add(self::TITLE, '%'.$word.'%', Criteria::LIKE); 
    $c->addAnd(self::ARTICLE_ID, null, Criteria::ISNOTNULL); 
    $c->addAscendingOrderByColumn(self::TITLE); 
    return self::doSelect($c); 
} 

,我的動作是:

public function executeSearch() 
{ 
    $this->word = $this->getRequestParameter('word'); 
    $this->content_type = $this->getRequestParameter('content_type'); 
    if($this->content_type == 'article') 
    { 
     $words = ItemPeer::searchFromRequest($this->word); 
    } 
    else 
    { 
     echo "Nothing here"; 
    } 

我可以var_dump($words),我得到項目的數組(集合)。問題是,我如何返回JSON中的所有項目?

我已經嘗試使用:

 $this->getResponse()->setHttpHeader('Content-type', 'application/json'); 
     $words = ItemPeer::searchFromArticleRequest($this->word); 
     return $this->renderText(json_encode($words)); 

但這只是返回空JSON支架的負荷:[{},{},{},{},{},{},{},{},{},{},{},{},{},{}]

感謝

+0

你正在使用什麼版本的Propel和Symfony? – 2011-03-25 06:50:46

+0

@Jan Fabry我正在使用symfony 1.4和Propel 1.4 – terrid25 2011-03-25 11:13:01

回答

3

看起來json_encode()不喜歡Propel對象的構建方式。

另一種解決方案可以迫使行走到returnin基本的關聯對象,使用XXXPeer::doSelectStmt()

public static function searchFromRequest($word, $returnPropelObjects = true) 
{ 
    $c = new Criteria(); 
    $c->addJoin(self::ARTICLE_ID, ArticlePeer::ID); 
    $c->add(self::TITLE, '%'.$word.'%', Criteria::LIKE); 
    $c->addAnd(self::ARTICLE_ID, null, Criteria::ISNOTNULL); 
    $c->addAscendingOrderByColumn(self::TITLE); 

    if ($returnPropelObjects) 
     return self::doSelect($c); 

    $stmt = self::doSelectStmt($c); 
    $results = array(); 
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     $results[] = $row; 
    } 
    return $results; 
} 
+1

是的,我喜歡你的解決方案比我的更好:) – Aston 2011-03-24 20:41:29

+0

工作就像一個魅力! – terrid25 2011-03-25 11:29:27

1

的json_encode/json_decode只能編碼/解碼PHP數組不是對象。變量

$words 

將是一個Item對象的數組,這就是爲什麼你寫的輸出。

基本上有兩種解決方案。你寫你自己的JSON編碼器爲對象的作品,如第一條評論點擊這裏:

http://php.net/manual/en/function.json-encode.php

或者你寫的轉換你的項目對象爲PHP數組喜歡這裏的函數:

http://www.phpro.org/examples/Convert-Object-To-Array-With-PHP.html

1

您也可以致電你的對象toArray()

$words = ItemPeer::searchFromArticleRequest($this->word); 
$wordsArray = array(); 
foreach ($words as $word) 
{ 
    $wordsArray[] = $word->toArray(); 
} 
return $this->renderText(json_encode($wordsArray)); 

Propel 1.6 will have a toJSON() method對於單個對象或整個對象集合。

+0

我發現了針對單個對象的jSON()方法,但尚未找到整個集合。如何序列化一個集合?** UPD ** Ooops,這就是 - exportTo('JSON')。 – 2012-02-10 11:15:00

3

行走1.6:

  • 對象 - >的toJSON();
  • collection-> exportTo('JSON');