请问一下,在使用模型关联的方法来实现无限级分类时,怎么控制每一层的字段个数。

// 获取方法
$arr = OrganizeModel::where('p_id', $root_id)
  ->select('id', 'p_id', 'organize_name')->with(['organize' => function ($sql) {
            $sql->select('id', 'p_id', 'organize_name');
 }])->get()->toArray();

dd($arr);

// 运行结果
 [
     'id' => 1,
    'p_id' => 0,
    'organize_name' => '全国',
    'organize' => [
        'id' => 2,
        'p_id' => 1,
        'organize_name' => '区域',
        'organize' => [
            //    第三层之后就显示全部字段了。
        ],
    ],
 ]
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
sreio
最佳答案

一次性取出来数据用php处理也比mysql好啊

function arr2tree($list, $id = 'id', $pid = 'pid', $son = 'sub')
 { 
     list($tree, $map) = [[], []]; 
     foreach ($list as $item) { 
         $map[$item[$id]] = $item; 
     } 
     foreach ($list as $item) { 
         if (isset($item[$pid]) && isset($map[$item[$pid]])) { 
             $map[$item[$pid]][$son][] = &$map[$item[$id]]; 
         } else {
          $tree[] = &$map[$item[$id]]; 
         } 
     } 
     unset($map); 
     return $tree; 
 }
3年前 评论
讨论数量: 7

$sql->select('id', 'p_id', 'organize_name'); 放到你定义organize这个关联关系的方法里面就好了呀。

3年前 评论
sreio

不建议用数据库这样多次查询

3年前 评论
sreio

一次性取出来数据用php处理也比mysql好啊

function arr2tree($list, $id = 'id', $pid = 'pid', $son = 'sub')
 { 
     list($tree, $map) = [[], []]; 
     foreach ($list as $item) { 
         $map[$item[$id]] = $item; 
     } 
     foreach ($list as $item) { 
         if (isset($item[$pid]) && isset($map[$item[$pid]])) { 
             $map[$item[$pid]][$son][] = &$map[$item[$id]]; 
         } else {
          $tree[] = &$map[$item[$id]]; 
         } 
     } 
     unset($map); 
     return $tree; 
 }
3年前 评论

这个第二层以下都是懒加载,有多少层就会有多少次sql查询;如果数据量不多,建议一次性取出来,程序端生成层次关系;

3年前 评论

@ware 感谢您的帮助。

3年前 评论

@LiamHao 感谢您的帮助。

3年前 评论

@WadeYu 感谢您的帮助。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!