0

我正在使用 CakePHP 查询我的数据库表“任务”,其中包括 project_id、id、parent_id、title、description。我的控制器代码像这样处理查询:

$query= $this->Task->find('threaded', array(
                'conditions' => array(
                    'Task.project_id'  => 83,
                ), 
                'fields' => array(
                    'Task.id',
                    'Task.title',
                    'Task.parent_id',

                )
        ));
//Pass the result to the view
$this->set('query', $query);

然后在我看来,如果我使用以下内容解码 json:

<?php echo json_encode($simple); ?>

我得到以下json结构:

[
{
    "Task": {
        "id": "475",
        "title": "Have a Picnic",
        "parent_id": "0"
    },
    "children": [
        {
            "Task": {
                "id": "476",
                "title": "Drive/Hike to Moutains",
                "parent_id": "475"
            },
            "children": []
        }
    ]
}

]

(我用这个工具美化了它,输出当然是一个连续的字符串)

但是 JS JIT SpaceTree 需要以下结构:

    {
  "id": "aUniqueIdentifier",
  "name": "usually a nodes name",
  "data": [
      {key:"some key",       value: "some value"},
    {key:"some other key", value: "some other value"}
  ],
  children: [/* other nodes or empty */]
}

而且我不知道如何调整输出或更改我的查询以返回正确的结构。此外,我尝试了“线程”和“列表”find() 类型并获得相同的结构。非常感谢任何帮助!

4

1 回答 1

0

只需迭代结果并将数据映射到您想要的结构中,这是一项非常基本的任务。您可以在控制器、视图中(可能使用帮助程序)甚至在模型中使用自定义查找方法来执行此操作。

这是一个简单的例子。我不知道有什么data好处,您的结果中也没有其他字段,所以我离开了那部分。

function mapThreaded($source, &$target)
{
    foreach($source as $item)
    {
        $node = array
        (
            'id' => $item['Task']['id'],
            'name' => $item['Task']['title'],
            'children' => array()
        );

        if(count($item['children']))
        {
            mapThreaded($item['children'], $node['children']);
        }

        $target[] = $node;
    }
}

$tasks = $this->Task->find('threaded', array(...));

$tree = array();
mapThreaded($tasks, $tree);

pr($tree);
pr(json_encode($tree, JSON_PRETTY_PRINT)); // pretty print requires PHP >= 5.4.0

它应该产生这样的 JSON 结构:

[
    {
        "id": "475",
        "name": "Have a Picnic",
        "children": [
            {
                "id": "476",
                "name": "Drive/Hike to Moutains",
                "children": [

                ]
            }
        ]
    }
]

如果 Spacetree 仅支持单个根元素,只需使用current($tree)或在 JavaScript 中将第一个数组条目传递给 Spacetree。

于 2013-09-11T15:11:26.997 回答