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。
答案 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
}, ...
]
}, ...
]
}