鍍金池/ 問答/PHP/ 尋求更好的代碼寫法

尋求更好的代碼寫法

假設有2張表

CREATE TABLE IF NOT EXISTS `structure` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `name` varchar(64) DEFAULT '' COMMENT '名稱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT = '部門表';

CREATE TABLE IF NOT EXISTS `structure` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `realname` varchar(64) DEFAULT ''  COMMENT '姓名',
  `structure_id` int(11) DEFAULT NULL COMMENT '所屬部門',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT = '用戶表';

部門表跟人員表是一個一對多的關系,請問編寫接口如何生成這種結構?

{
    data: [{
        'id': '', // 部門ID
        'name': '', // 部門名稱
        'list': [{ // 用戶列表
            'id': '', // 用戶ID
            'realname' : '', // 用戶姓名
        }],
    }]
}

現(xiàn)在我有一個寫法,但是總覺得不是太好(用的是tp5語法), 即是把數(shù)據(jù)都查出來再處理入數(shù)組中。

function test()
{
    $structure = Db::name('structure')->select();
    $user = Db::name('user')->select();
    foreach ($structure as &value) {
        foreach ($user as $k => $v) {
            if ($value['id'] == $v['structure_id']) {
                $value['list'][] = $v;
                unset($user[$k]);
            }
        }
    }
    
    return $structure;
}
回答
編輯回答
詆毀你

你這個思路不對啊,應該是關聯(lián)查詢才對。
sql:

select * from 部門表 left join 用戶表 on 部門表的id = 用戶表的部門id

這樣得到的結果集就是以部門為主用戶為輔的數(shù)據(jù)集,最后對它做一次遍歷組合成你那種格式的數(shù)據(jù)就ok了。

2018年8月11日 18:48