2

我正在尝试使用 Propel ORM 制作一个非常简单的“列出所有”功能 - 供 Backbone.js 阅读。这就是我想要做的,在我看来,应该工作:

$users = UsersQuery::create()
->find();

echo $users->toJSON();

但是,当我运行它时,我得到的结果是:

{"Users_0":{"Id":1,"EmailAddress":"sdf","Password":"sdf","CreatedAt":null,"ModifiedAt":null},
"Users_1":{"Id":2,"EmailAddress":"dsf","Password":"sdf","CreatedAt":null,"ModifiedAt":null}}

虽然它是有效的 JSON,但每一行都是主数组中的一个数组这一事实正在抛弃我的 JSON。我需要它返回的是这样的 JSON:

[{"Id":1,"EmailAddress":"sdf","Password":"sdf","CreatedAt":null,"ModifiedAt":null},{"Id":2,"EmailAddress":"dsf","Password":"sdf","CreatedAt":null,"ModifiedAt":null}]

我已经创建了以下函数(作为测试)并且它运行良好,但肯定 Propel(或 Slim,我正在使用的框架)有办法阻止数组中的所有内容?这里是黑客;

$users = UsersQuery::create()
->find();

$json = '[';
foreach($users as $user){
    $json = $json.$user->exportTo('JSON').',';
}
$json = $json.']';
echo str_replace("},]", "}]", $json);

任何帮助将不胜感激!谢谢大家。

4

3 回答 3

1

我不想这么说,但我认为这只是“Propel 就是这样工作的”情况之一。也就是说,您可以稍微改进您的辅助功能以使其更加健壮。

我会把这段代码放在你的 UserQuery 类中:

class UsersQuery extends BaseUsersQuery {
  ...

  public function toJSONArray() {
    $users = $this->find();
    $userArray = array();
    foreach($users as $user){
      array_push($userArray, $user->toArray());
    }
    return json_encode($userArray);
  }
}

然后像这样使用它...

$userJSON = UsersQuery::create()->toJSONArray();

或者,如果您有其他标准...

$userJSON = UsersQuery::create()
              ->filterBySomeField("someValue")
              // other Criteria ...
              ->toJSONArray();
于 2013-04-08T22:08:04.140 回答
0

是否有可能的解决方案在一个语句中使用这个和一个选择过滤器。像这样的东西:

   $ojson = TblproductQuery::create()
        ->select(array('ProdtID', 'DivnID'))
        ->toJsonArray();
于 2013-06-26T07:23:38.143 回答
0

接受的答案没有解决的一件事是当您有一个带有嵌套集合的对象时。就像你有一堆测试一样,答案是这样的:

[
  {
    id:test1,
    answers : [
      { id: 1, answer: pig},
      { id: 2, answer: dog}
    ]
  },
  {
    id:test2,
    answers : [
      { id: 5, answer: duck},
      { id: 6, answer: swan}
    ]
  }
]

当您尝试使用已接受的答案时,上述内容无法与骨干集合很好地配合。PropelCollection::toArray()这是因为每个推进模型都会在其自身的任何推进集合上 调用该方法

PopelCollection::toArray()方法只会将自身作为 php 中的关联数组返回,该数组将转换为 JSON 中的未排序集,而不是数组。主干集合仅排序(数组)。

为了解决这个问题,我只是将toArray()propel 源文件PropelCollection.php中的方法更改为以下内容:

public function toArray(
    $keyColumn = null, 
    $usePrefix = false, 
    $keyType = BasePeer::TYPE_PHPNAME, 
    $includeLazyLoadColumns = true, 
    $alreadyDumpedObjects = array()){

  $ret = array();
  foreach ($this as $key => $obj) {
    array_push($ret, $obj->toArray($keyType, $includeLazyLoadColumns, 
      $alreadyDumpedObjects, true);
  }

  return $ret;
}

我还没有看到这如何影响 toXML 或 toYAML 方法,但它允许 toJSON 方法像我上面的示例一样使用嵌套集合。

于 2014-02-19T22:33:23.073 回答