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

戻り値:

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

リレーションを配列として欲しい:

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

これは、ORM がレコードの PKEY に対応するキーを持つ関連する結果配列を返し、JSON がこれをオブジェクトとして解釈するために発生します。これらの配列を通過させたいarray_values()ので、JSON の結果は Array を使用します。

現在、問題を「解決」するためにこれを行っています。

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

しかし、これは、データが存在することがわかっている 1 つまたは 2 つのレベルでのみ役に立ちます。

保証されていない関係がある場合、複雑なモデルのすべての潜在的なサブセットをエラーチェックする必要はありません。

レコード PKEY ではなく、すべての 1 対多配列に順次キーを設定したいだけです。

4

4 に答える 4

1

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

1.6 未満ではクエリ オブジェクトを返し、1.6 では例外を返し、1.6.1 以降では null を返します。だから私はあなたがその結果を生み出す何か他のことをすると仮定します.

オブジェクトではなく結果として配列が必要な場合は、結果を変換する必要があります。これを行うには、モデル オブジェクトを呼び出すto_array()か、Format クラスを使用してモデル オブジェクトの配列を配列に変換します。 $result = \Format::forge($result)->to_array();

于 2013-06-11T10:29:28.427 に答える
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();

この方法で配列キーをチェックします。キーが数値で、値がオブジェクトまたは配列の場合はクリーンキー

于 2016-05-31T19:38:48.087 に答える
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
          }, ...
      ]
    }, ...
  ]
}
于 2015-12-12T16:19:38.483 に答える