【问题标题】:Multi row toJSON function using Propel and Backbone使用 Propel 和 Backbone 的多行 toJSON 函数
【发布时间】:2013-04-08 20:44:39
【问题描述】:

我正在尝试使用 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);

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

【问题讨论】:

    标签: php json orm propel slim


    【解决方案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();
    

    【讨论】:

    • 是的——就是这样,除了:array_push($userArray, $user->toArray());否则你最终会得到每个数组作为一个字符串...
    • 确认!感谢您抓住它,我会在答案中修复它。很高兴它有帮助。
    【解决方案2】:

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

       $ojson = TblproductQuery::create()
            ->select(array('ProdtID', 'DivnID'))
            ->toJsonArray();
    

    【讨论】:

      【解决方案3】:

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

      [
        {
          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 中的未排序集而不是数组。主干集合仅排序(数组)。

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

      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 方法像我上面的示例一样使用嵌套集合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-24
        • 2012-03-23
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多