2017-06-29 8 views
-1

返された結果をDB SQL Mapperから認識可能なjsonエンコード済み配列に処理する際に問題があります。fatfreeからの処理結果jsonエンコーディング用のSQL Map Mapper

function apiCheckSupplyId() { 
    /*refer to the model Xrefs*/ 
    $supply_id = $this->f3->get('GET.supply_id'); 
    $xref = new Xrefs($this->tongpodb); 
    $supply = $xref->getBySupplyId($supply_id); 
    if (count($supply) == 0) { 
    $this->logger->write('no xref found for supply_id=' .$supply_id); 
    $supply = array(array('id'=>0)); 

    echo json_encode($supply); 
    } else { 
    $json = array(); 
    foreach ($supply as $row){ 
     $item = array(); 
     foreach($row as $key => $value){ 
     $item[$key] = $value; 
     } 
     array_push($json, $item); 
    } 


    $this->logger->write('xref found for supply_id=' .$supply_id.json_encode($json) ); 
    echo json_encode($json); 
    } 
} 

これは、私が使用しています方法ですが、それは私にとって非常に不格好と思われます。より良い方法がありますか? getBySupplyIdを想定し

+0

1回の供給あたりの外部参照はどれくらいですか? 1?以上? – xfra35

+0

1つは理想的かもしれませんが、この不気味な世界では保証されません –

答えて

1

Xrefマッパーの配列を返します、あなたはこのような全体のこと簡略化することができます:

function apiCheckSupplyId() { 
    $supply_id = $this->f3->get('GET.supply_id'); 
    $xref = new Xrefs($this->tongpodb); 
    $xrefs = $xref->getBySupplyId($supply_id); 
    echo json_encode(array_map([$xref,'cast'],$xrefs)); 
    $this->logger->write(sprintf('%d xrefs found for supply_id=%d',count($xrefs),$supply_id)); 
} 

を説明:

$xrefs変数は、マッパーの配列が含まれています。各マッパーはオブジェクトであるため、castをJSONにエンコードする前に配列に渡す必要があります。これは、$xref->cast()メソッドを各レコードにマッピングすることにより、1行で行うことができます。array_map([$xref,'cast'],$xrefs)

あなたは、その構文と自信がないなら、あなたは各レコードをループができて、それをキャスト:

$cast=[]; 
foreach ($xrefs as $x) 
    $cast[]=$x->cast(); 
echo json_encode($cast); 

結果は同じです。

cast()を使用する利点は、(オリジナルのスクリプトで行っているように)各値を読み取るだけで、virtual fieldsも含まれているということです。

関連する問題