Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用FuelPHP';返回JSON数组而不是对象;s ORM和Controller_Rest_Fuelphp_Fuelphp Orm - Fatal编程技术网

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

如何使用FuelPHP';返回JSON数组而不是对象;s ORM和Controller_Rest,fuelphp,fuelphp-orm,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: goo

返回:

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
    }
  }
}
这是因为ORM返回相关的结果数组,其中的键对应于记录的PKEY,JSON将其解释为对象。我希望这些数组通过
array\u values()
或其他方式,这样JSON结果将使用array

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

{
  stuff: here,
  looks: good,
  hasMany: [
    {
      id: 151251,
      other: stuff
    }
  ]
}
但这只对一两个级别有用,因为我知道数据将在其中

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


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

$query=Model\u Something::find()->related('hasMany')

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

如果希望数组作为结果而不是对象,则需要转换结果。您可以通过对模型对象调用
到_array()

$result=\Format::forge($result)->to_array()

简言之:除非在
Query:hydrome
中创建一个钩子,或者使用返回与
hydrome
非常相同的结果的一些实现来隐藏
Query
类,否则不能执行此操作

可以通过编程实现。遵循下面的模型,但对于非常深层的关系,算法的复杂性并不令人感兴趣

型号:

方法调用:

结果和你想要的一模一样

结果:

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

$something->relatedAsArray();

这样可以检查数组键;如果key是number,value是object或array,那么clean key

格式::forge()
不是我想要的;传出的JSON仍然基于id键控数组,并将表示为JSON对象,而不是数组。我将添加我当前的解决方法来说明这一点。+1用于指出
find()
已被弃用,取而代之的是
query()
:)您想要一个我理解的索引数组。这是不会产生的,ORM使用数组索引值来存储相关记录的PK,以便可以找到它。array_values()可能是最好的选择。虽然这段代码可能会解决这个问题,但您也应该在代码中附带解释。我同意您的看法,但我的英语不好
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
          }, ...
      ]
    }, ...
  ]
}
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();