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 将其解释为 Object。我希望这些数组通过array_values()什么的,所以 JSON 结果将使用 Array.

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

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

但这仅对我知道数据所在的一两个级别有用。

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

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

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

简而言之:你不能,除非你在Query:hydrate https://github.com/fuel/orm/blob/1.7/develop/classes/query.php#L1083Query创建一个钩子,或者用一些返回非常的实现来隐藏类相同的结果,除了hydrate

于 2013-07-01T08:35:21.560 回答
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 回答