You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter关联表数据无法渲染到下拉框问题求助

CodeIgniter关联表数据渲染下拉框问题修复

问题描述

在CodeIgniter框架中,尝试关联tb_users.id_user与tb_bonus.id_user,将用户姓名渲染到下拉框,但下拉框仅显示默认选项,无任何用户数据。

原始尝试代码

模型(Umum_model.php)

function getNama(){
        $this->db->select('*');
        $this->db->from('tb_bonus');
        $this->db->join('tb_users', 'tb_users.id_user = tb_bonus.id_user');
        $join_query = $this->db->get();
    }

控制器(Bonus.php)

function __construct()
    {
        parent::__construct();

        $this->load->library('form_validation');
        $this->load->model('Umum_model', 'umum');

    }

    public function index()
    {
        $data = [
            'view' => 'admin/bonus',
            'active' => 'bonus',
            'sub1' => 'bonus',
        ];

        $namalengkap['namaUser'] = $this->umum->getNama();
        
        $this->load->view('template_admin/index', $data, $namalengkap);
    }

视图(bonus.php)

<select class="form-control" id="id_user" name="id_user" required>
  <option value="">No Selected</option>
    <?php foreach($namaUser as $nama){ ?>
      <option value=""><?=$nama->nama_lengkap?></option>
    <?php } ?>
</select>

问题分析

  1. 模型未返回查询结果:getNama()函数仅执行查询,未返回结果集,导致控制器无法获取数据
  2. 控制器数据传递错误:CodeIgniter的load->view()第三个参数是布尔值(控制是否返回视图内容),不能用于传递额外数据,需将数据合并到主$data数组
  3. 视图存在两处问题:下拉框option的value为空(无法提交有效ID);未处理数据为空的边界情况
  4. 查询逻辑优化:原查询从tb_bonus出发,可能遗漏无奖金记录的用户;且select *会获取冗余字段,建议按需选择字段并去重

修正后的代码

模型(Umum_model.php)

function getNama(){
    // 仅选择需要的字段,避免冗余
    $this->db->select('tb_users.id_user, tb_users.nama_lengkap');
    $this->db->from('tb_users');
    // 若需仅显示有奖金记录的用户用inner join,需显示所有用户则改为left join
    $this->db->join('tb_bonus', 'tb_users.id_user = tb_bonus.id_user', 'inner');
    // 去重避免同一用户多次出现
    $this->db->distinct();
    // 返回对象格式的结果集
    return $this->db->get()->result();
}

控制器(Bonus.php)

function __construct()
{
    parent::__construct();
    $this->load->library('form_validation');
    $this->load->model('Umum_model', 'umum');
}

public function index()
{
    $data = [
        'view' => 'admin/bonus',
        'active' => 'bonus',
        'sub1' => 'bonus',
        // 将用户数据合并到$data数组,传递给视图
        'namaUser' => $this->umum->getNama()
    ];
    
    $this->load->view('template_admin/index', $data);
}

视图(bonus.php)

<select class="form-control" id="id_user" name="id_user" required>
  <option value="">未选择</option>
    <?php if(!empty($namaUser)): ?>
      <?php foreach($namaUser as $nama): ?>
        <!-- 设置option的value为用户ID,便于提交表单时获取有效数据 -->
        <option value="<?= htmlspecialchars($nama->id_user) ?>">
            <?= htmlspecialchars($nama->nama_lengkap) ?>
        </option>
      <?php endforeach; ?>
    <?php else: ?>
      <!-- 无数据时显示提示并禁用选项 -->
      <option value="" disabled>暂无用户数据</option>
    <?php endif; ?>
</select>

内容的提问来源于stack exchange,提问作者sound_of_coups

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:36:16