2013-06-10 3 views
0
Controller_Something extends Controller_Rest { 
    public function get_something() {  
    $query = Model_Something::query()->related('hasMany')->get(); 
    return $this->response($query); 
    } 
} 

반환 사용하여 객체 대신 JSON 배열을 반환을 수행하십시오 ORM은 관련 반환하기 때문에이 문제가 발생어떻게 FuelPHP의 ORM과 Controller_Rest

{ 
    stuff: here, 
    looks: good, 
    hasMany: [ 
    { 
     id: 151251, 
     other: stuff 
    } 
    ] 
} 

:

{ 
    stuff: here, 
    looks: good, 
    hasMany: { 
    151251: { 
     id: 151251, 
     other: stuff 
    } 
    } 
} 

을 나는 배열과 관계를 원하는 레코드의 PKEY에 해당하는 키가있는 결과 배열을 JSON이이를 Object로 해석합니다. 이 배열을 array_values() 또는 그 밖의 것들을 통과 시키길 원한다. 그래서 JSON 결과는 Array를 사용할 것이다. 현재 내가이 일을하고

문제 "해결"하기 :

$res = Format::forge($result_set)->to_array(); 
$res['hasMany'] = array_values($res['hasMany']); 
return $this->response($res); 

을하지만 내가 데이터가 될 것입니다 알고 하나 또는 두 개의 레벨 만 유용합니다.

보장되지 않는 관계가있는 경우 복잡한 모델의 모든 잠재적 하위 집합을 오류 검사해야 할 필요가 없습니다.

레코드 PKEY 대신 순차적으로 모든 일대 다 배열을 키 입력하기 만하면됩니다.

답변

0

: 당신은 당신이 Query:hydratehttps://github.com/fuel/orm/blob/1.7/develop/classes/query.php#L1083에 후크를 만들 수 없다면 당신은 모델 객체에 to_array()를 호출하여, 또는 배열에 모델 객체의 배열을 변환하는 형식의 클래스를 사용하여 그렇게 할 수 있습니다 을 제외하고 매우 동일한 결과를 반환하는 구현을 사용하여 Query 클래스를 섀도 잉해야합니다.

1

$query = Model_Something::find()->related('hasMany');

는 1.6.1+에서 < 1.6에서 질의 객체, 1.6에서 예외 및 널 (null)을 반환합니다. 그래서 나는 그 결과를 만들어내는 뭔가 다른 것을한다고 가정합니다.

개체 대신 결과로 배열을 사용하려면 결과를 변환해야합니다. 한마디로 $result = \Format::forge($result)->to_array();

+0

'Format :: forge()'는 내가 원하는 것이 아닙니다. 나가는 JSON은 id-keyed 배열을 기반으로하며 배열이 아닌 JSON 객체로 표현됩니다. 이를 보여주기 위해 현재 해결 방법을 추가하겠습니다. – willoller

+0

'find()'를 가리키는 +1은'query()'를 위해 더 이상 사용되지 않습니다 :) – willoller

+0

당신은 색인 된 배열을 원합니다. ORM은 배열 인덱스 값을 사용하여 관련 레코드의 PK를 저장하므로 다시 찾을 수 있습니다. array_values ​​()가 가장 좋은 옵션 일 것입니다. – WanWizard

0

프로그래밍 방식으로 수행 할 수 있습니다. 아래 모델을 따르지만 매우 깊은 관계에 대해서는 알고리즘의 복잡성으로 인해 흥미롭지 않습니다.

모델 : 방법의

class Model_Something extends \Orm\Model 
{ 
    ... 

    public function relatedAsArray() 
    { 
     $this->relationsAsArray($this->_data_relations); 
    } 

    private function relationsAsArray(&$relations) 
    { 
     foreach ($relations as $key => $relation) { 
      foreach ($relation as $fields) { 
       foreach ($fields as $field) { 
        if (isset($field->_data_relations)) { 
         $this->relationsAsArray($field->_data_relations); 
        } 
       } 
      } 

      if (is_array($relation)) { 
       $relations[$key] = array_values($relation); 
      } 
     } 
    } 
} 

전화 :

$something = Model_Something::find($somethingId, array('related' => array('hasMany', 'hasMany.hasOthers'))); 

$something->relatedAsArray(); 

당신이 원하는 같은 결과는 정확했다.

결과 :

{ 
    stuff: here, 
    looks: good, 
    hasMany: [ 
    { 
     id: 151251, 
     other: stuff, 
     hasOthers: [ 
      { 
      id: 12312, 
      field: other 
      }, ... 
     ] 
    }, ... 
    ] 
} 
1
function object_to_array($data){ 
     $new_data2= array(); 
     $keys = array_keys((array)$data); 
     foreach ($keys as $key) 
     { 
      $value = $data[$key]; 

      if(is_numeric($key)) 
      { 
       $new_data2[] = object_to_array($value); 

      }elseif(is_string($value) || is_null($value)) 
      { 
       $new_data2[$key] = $data[$key]; 
      }else 
      { 
       $new_data2[$key] = object_to_array($value); 
      } 

     } 

     return $new_data2; 
    } 
$formattedArray = \Format::forge(Model_Product::query()->get())->to_array(); 

$cleanData=object_to_array($formattedArray); 

echo \Format::forge($cleanData)->to_json(); 

이 방법은 키 배열을 확인; key가 숫자이고 값이 객체 또는 배열 클린 키이면

+0

이 코드는 문제를 해결할 수 있지만 항상 코드와 함께 설명을 첨부해야합니다. –

+0

나는 동의하지만 나쁜 영어가있다. –