如何使用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();