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

// 获取方法
$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' => [
            //    第三层之后就显示全部字段了。
        ],
    ],
 ]
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
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; 
 }
5年前 评论
讨论数量: 7

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

5年前 评论
sreio

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

5年前 评论
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; 
 }
5年前 评论

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

5年前 评论

@ware 感谢您的帮助。

5年前 评论

@LiamHao 感谢您的帮助。

5年前 评论

@WadeYu 感谢您的帮助。

5年前 评论

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