如何使用FuelPHP的ORM和Controller_Rest返回JSON数组而不是对象

时间:2013-06-10 22:12:47

标签: fuelphp fuelphp-orm

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将其解释为Object。我希望这些数组通过array_values()或其他东西,因此JSON结果将使用Array。

目前我这样做是为了“解决”问题:

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

但这仅适用于一个或两个级别,我知道数据将是。

如果存在无法保证的关系,我不需要对复杂模型的每个潜在子集进行错误检查。

我只想按顺序键入所有一对多数组,而不是记录PKEY。

4 个答案:

答案 0 :(得分:1)

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

返回<中的查询对象。 1.6,1.6中的异常,1.6.1+中的null。所以我假设你做了一些产生这种结果的事情。

如果您希望数组而不是对象,则需要转换结果。您可以通过在模型对象上调用to_array()或使用Format类将模型对象数组转换为数组来实现: $result = \Format::forge($result)->to_array();

答案 1 :(得分:1)

Redis

这种方式检查数组键;如果key是number且value是object或array clean key

答案 2 :(得分:0)

简而言之:除非你在Query:hydrate https://github.com/fuel/orm/blob/1.7/develop/classes/query.php#L1083中创建一个钩子,或者用Query类隐藏一些实现,除了{{1}之外返回相同的结果,否则你不能这样做}}。

答案 3 :(得分: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
          }, ...
      ]
    }, ...
  ]
}