【问题标题】:nested set save to database嵌套集保存到数据库
【发布时间】:2018-03-24 21:03:12
【问题描述】:

我正在尝试使用 Laravel 应用程序实现 jqTree。

  1. 控制器获取数据并返回视图:

    公共函数索引() { $categories = Category::get(['id', 'name', '_lft', '_rgt', 'parent_id'])->toTree(); 返回视图('category.index',[ '类别' => $类别 ]); }
  2. 这是一个视图(javascript部分):

    变量数据 = {!! $类别!!}; $('#tree').tree({ 数据:数据, 拖放:真, onDragStop:句柄移动, }); 函数句柄移动(){ var treeData = $('#tree').tree('toJson');
    $.ajax({
        url: 'category',
        type: 'POST',
        headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') },
        data: { data: treeData },
    });
    
    }
  3. 这可以正确构建树,我可以拖放项目。但是,我想将重新排序的树保存回数据库。这是控制器中的 post 方法:

    公共功能存储(请求 $request) { $data = $request->数据; $result = Category::rebuildTree($data); ... }

调用rebuildTree方法后,我得到这个错误:

Type error: Argument 1 passed to Kalnoy\\Nestedset\\QueryBuilder::rebuildTree() must be of the type array, string given

我试过这个:

public function store(Request $request)
{
  $data = $request->data;
  $data = json_decode($request->data);
  $array_data = (array) $data;
  $result = Category::rebuildTree($data);
  ...
}

然而这会返回:

不能使用 stdClass 类型的对象作为数组

如何获取传递的数据数组,以便我可以使用rebuildTree() 方法并更新数据库?

这是dd($request->data):的结果

[{"name":"Storage","id":3,"_lft":17,"_rgt":18,"parent_id":null,"is_open":true,
    "children":[{"name":"Laptops","id":1,"_lft":1,"_rgt":10,"parent_id":null,"is_open":true,
    "children":[{"name":"Monitors","id":2,"_lft":11,"_rgt":16,"parent_id":null,
    "children":[{"name":"IPS","id":5,"_lft":14,"_rgt":15,"parent_id":2}]},
    {"name":"Macbook","id":6,"_lft":2,"_rgt":3,"parent_id":1},
    {"name":"Acer","id":7,"_lft":4,"_rgt":5,"parent_id":1},
    {"name":"New Subcategory Name","id":8,"_lft":6,"_rgt":7,"parent_id":1},
    {"name":"New Subcategory ame","id":9,"_lft":8,"_rgt":9,"parent_id":1}]}]},
    {"name":"Memory","id":4,"_lft":19,"_rgt":20,"parent_id":null}]

另外,要明确一点:我使用的是jqTree

嵌套集是lazychaser/laravel-nestedset

【问题讨论】:

  • 你能在你的 store 方法中展示你用 dd($request->data) 得到了什么吗?
  • 请查看更新后的帖子,您可以在其中看到 dd 输出。谢谢:)

标签: ajax laravel nested-sets jqtree


【解决方案1】:

您在$request->data; 中得到json,您需要使用json_decode() 以及第二个参数作为assoc 的true 在数组中对其进行解码

see the manual

联想

当为 TRUE 时,返回的对象将被转换为关联对象 数组。

public function store(Request $request)
{
  $result = Category::rebuildTree(json_decode($request->data,True));
  ...
}

如果您需要在$data 中传递它,那么像这样传递它。

$data = json_decode($request->data,True);

或者

foreach ($request->data as $value) 
    $array[] = $value->name;

然后像这样将$array 传递到您的查询中

$result = Category::rebuildTree($array);

【讨论】:

  • 如果我使用$result = Category::rebuildTree($request->data);,那么这是一个错误:类型错误:传递给 Kalnoy\Nestedset\QueryBuilder::rebuildTree() 的参数 1 必须是数组类型,给定字符串 $data[] = $request->data; 返回 array_key_exists() 期望参数 2 是数组,给定字符串
  • 不,我没有。但是,即使我添加它们,我也会得到相同的结果。这里的问题是 jqTree 返回一个字符串而不是数组
  • 确保您在var treeData = $('#tree').tree('toJson'); 中有数组,如果是这样,那么您需要使用 json_decode() 我认为您在 $request->data 中获得了 json,laravel 将其视为字符串
  • 已经尝试过json_decode() - 查看我的原始帖子。谢谢 :) 结果是Cannot use object of type stdClass as array
  • 终于!很明显:json_decode($request->data, TRUE) 返回关联数组。我一直缺少json_decode() 的可选参数 :) 谢谢!!!
猜你喜欢
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
相关资源
最近更新 更多