如何在Codeigniter控制器中从逗号分隔的员工ID中读取员工姓名

7fyelxc5  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(47)

我有一个像下面这样的user_access表:
| 模块id|用户标识|
| --|--|
| 101 |一二三|
| 102 |一、三|
我已经用codeigniter控制器将数据从数据库中提取到datatable中。控制器如下所示:
public function getName(){

$draw = intval($this->input->get("draw"));
    $start = intval($this->input->get("start"));
    $length = intval($this->input->get("length"));

    $fetch = $this->Erp_model->get_user_access_settings();
    $data = array();

    foreach($fetch->result() as $r) {
        
        $users = explode(',',$r->user_id);
        foreach($users as $user) {
            $read = $this->Erp_model->read_user_info($user);
            $name = $read[0]->first_name.' '.$read[0]->last_name;
        }

        $data[] = array(
            $combhr,
            $r->module_id,
            $name
        );
    }
    $output = array(
        "draw" => $draw,
        "recordsTotal" => $fetch->num_rows(),
        "recordsFiltered" => $fetch->num_rows(),
        "data" => $data
    );
    echo json_encode($output);
    exit();
}`

在前台,我可以看到一个员工的名字,而有几个名字。前端视图如下:
| 模块ID|员工|
| --|--|
| 101 |一|
| 102 |B|
但我想做到这样:
| 模块ID|员工|
| --|--|
| 101 |A、B、C|
| 102 |素八|
我如何使用Codeigniter控制器实现此操作?

vxqlmq5t

vxqlmq5t1#

对于您当前的数据库设置和代码,最简单的解决方案是使用数组来存储每行的名称($names = [];),然后在将它们添加到$data数组时使用逗号内爆名称:

public function user_access_list(){

    $draw = intval($this->input->get("draw"));
    $start = intval($this->input->get("start"));
    $length = intval($this->input->get("length"));

    $fetch = $this->Erp_model->get_user_access_settings();
    $data = array();

    foreach($fetch->result() as $r) {
        
        $names = [];
        $users = explode(',',$r->user_id);
        foreach($users as $user) {
            $read = $this->Erp_model->read_user_info($user);
            $names[] = $read[0]->first_name.' '.$read[0]->last_name;
        }

        $data[] = array(
            $combhr,
            $r->module_id,
            implode(',', $names)
        );
    }
    $output = array(
        "draw" => $draw,
        "recordsTotal" => $fetch->num_rows(),
        "recordsFiltered" => $fetch->num_rows(),
        "data" => $data
    );
    echo json_encode($output);
    exit();
}

更好的解决方案是规范化数据库,使user_access表看起来像这样(user_id列中只能有一个id,因此必须为每个用户重复module_id):
| 模块id|用户标识|
| --|--|
| 101 | 1 |
| 101 | 2 |
| 101 | 3 |
| 102 | 1 |
| 102 | 3 |
然后,您可以将这个user_access表连接到usersgroup bymodule_id,并使用group_concat获得用逗号分隔的名称。这样你就可以在一个查询中获得所有的数据(不再需要单独的查询来获得名称),所以速度会更快。

相关问题