【问题标题】:Codeigniter get list of names from table1 that have id from table2Codeigniter 从 table1 中获取具有 table2 id 的名称列表
【发布时间】:2015-01-05 17:51:27
【问题描述】:

我需要从“用户”表中获取名称列表及其 ID,这些表具有我正在显示的组的“组 ID”。我正在使用 CodeIgniter

在我看来,我想完成一个包含以下内容的表格:

| GroupID  | Group Name          | Users in Group         |
-------------------------------------------------------------
| 10001    | Group1              | User1, User3, User5    |
| 10002    | Group2              | User2, User6           |
| 10003    | Group3              | User4                  |

所以基本上表中的每个 groupid 条目我都希望在“组中的用户”列下有一个该组中的用户列表,逗号分隔。 “组中的用户”列中的每个用户都是指向其“编辑用户”页面的链接,该页面的 URL 为 mysite.com/admin/edituser/USERID

我的控制器:

class Admin extends CI_Controller {

 function __construct() {
    parent::__construct();
    $this->load->database('admin');
    $this->load->model('adminmodel','',TRUE);
 }
 public function groups() {
    if ($this->session->userdata('loggedin')) {
        $session_data = $this->session->userdata('loggedin');
        $data['username'] = $session_data['username'];

        $this->load->view('header', $data);
        $this->load->view('sidebar');
        $data['group_results'] = $this->adminmodel->list_groups();
        foreach ($data['group_results'] as $group_results) {
            $data['name_results'][$group_results['id']] = $this->adminmodel->list_users_in_group($group_results['id']);
        }
        $this->load->view('admin/groups', $data);
        $this->load->view('footer-nocharts');
    }
    else {
        //If no session, redirect to login page
        redirect('user/login', 'refresh');
    }
}

我的模特:

function list_groups() {
    $this->db->select('id, name');
    $this->db->from('groups')->order_by('id','asc');
    $query = $this->db->get();
    return $query->result();
}

function list_users_in_group($groupid) {
    $this->db->select('users.name, users.id, groups.id');
    $this->db->from('users')->order_by('users.name','asc');
    $this->db->where('groups.id', $groupid);
    $this->db->join('groups', 'groups.id = users.groupid');
    $query = $this->db->get();
    return $query;
}

还有观点:

<table class="table table-striped table-bordered table-hover" id="dataTables-example">
    <thead>
        <tr>
            <th style="width: 38px;">GroupID</th>
            <th style="width: 150px;">Group Name</th>
            <th style="width: 40px;">Users Assigned</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($admin_results as $admin_entry): ?>
            <tr class="odd gradeX">
                <td><?php echo $admin_entry->id; ?></td>
                <td><?php echo $admin_entry->name; ?></td>
                <td>
                <?php foreach ($name_results as $name): ?>
                    <?php echo "<a href='/admin/edituser/".$id."'>".$name."</a>,&nbsp;"; ?>
                <?php endforeach; ?></td>
            </tr>
        <?php endforeach; ?>
    </tbody>
</table>

数据库非常简单,两张表,每列两列。 用户表有列'id'(主键),'name' 组表有列'groupid'(主键),'name'

使用上面代码中的设置,我返回错误: PHP 致命错误:不能在第 36 行的 /var/www/html/application/controllers/admin.php 中使用 stdClass 类型的对象作为数组,我似乎不明白为什么。

感谢您的帮助。

--------------- 编辑 ------ 阅读评论和答案后,我相应地更改了一些内容。

型号:

function list_groups() {
    $this->db->select('id, name');
    $this->db->from('groups')->order_by('id','asc');
    $query = $this->db->get();
    return $query->result_array();
}

function list_users_in_group($groupid) {
    $this->db->select('users.name, users.id, groups.id');
    $this->db->from('users')->order_by('users.name','asc');
    $this->db->where('groups.id', $groupid);
    $this->db->join('groups', 'groups.id = users.groupid');
    $query = $this->db->get();
    return $query;
}

(基本上让list_groups返回一个数组)

现在,根据我在该列中的视图,我收到错误:

遇到 PHP 错误
严重性:通知
消息:未定义变量:id
文件名:admin/groups.php
行号:31

遇到 PHP 错误
严重性:4096
消息:CI_DB_mysqli_result 类的对象无法转换为字符串
文件名:admin/groups.php
行号:31

再次感谢。

【问题讨论】:

  • 如果你想要一个数组 - 尝试:在模型中的 list_groups() 函数中返回 $query->result_array()。

标签: php mysql codeigniter


【解决方案1】:

从您的代码示例中不清楚,但似乎这一行

$data['group_results'] = $this->adminmodel->list_groups();

返回stdClass 的实例。但是,在下一行,您想在该实例上 foreach,这对于这个特定的类是不可能的。

要解决这个问题,您可以简单地将 stdClass 实例类型转换为普通数组,如下所示:

$data['group_results'] = (array)$this->adminmodel->list_groups();

这样,您告诉 PHP 在赋值时将该实例转换为数组,然后您可以对其执行 foreach

如果你可以控制adminmodel-&gt;list_groups() 的实现,你也可以重构它,让它返回一个数组而不是stdClass。我将把它留给你来弄清楚如何在 CodeIgniter 中这样做。

【讨论】:

    【解决方案2】:

    终于明白了。

    我的主要问题是因为我没有为我的 $data['name_results'] 数组分配一个键,所以它显示了所有这些或仅显示前两个。分配一个键让一切变得更好。

    控制器:

    public function groups() {
        if ($this->session->userdata('loggedin')) {
            $session_data = $this->session->userdata('loggedin');
            $data['username'] = $session_data['username'];
    
            $this->load->view('header', $data);
            $this->load->view('sidebar');
            $data['group_results'] = $this->adminmodel->list_groups();
            foreach ($data['group_results'] as $group_results) {
                $data['name_results'][$group_results['id']] = $this->adminmodel->list_users_in_group($group_results['id']);
            }
            $this->load->view('admin/groups', $data);
            $this->load->view('footer-nocharts');
        }
        else {
            //If no session, redirect to login page
            redirect('user/login', 'refresh');
        }
    }
    

    型号:

    function list_groups() {
        $this->db->select('id, name');
        $this->db->from('groups')->order_by('id','asc');
        $query = $this->db->get();
        return $query->result_array();
    }
    
    function list_users_in_group($groupid) {
        $this->db->select('users.username, users.id, users.groupid');
        $this->db->from('users')->order_by('users.username','asc');
        $this->db->where('users.groupid', $groupid);
        $query = $this->db->get();
        return $query->result_array();
    }
    

    观点:

    <tbody>
        <?php foreach ($group_results as $group_entry): ?>
            <tr class="odd gradeX">
                <td><?php echo $group_entry['id']; ?></td>
                <td><?php echo $group_entry['name']; ?></td>
                <td>
                    <?php foreach ($name_results[$group_entry['id']] as $name): ?>
                        <?php echo "<a href='/admin/edituser/".$name['id']."'>".$name['username']."</a>,&nbsp;"; ?>
                    <?php endforeach; ?></td>
            </tr>
        <?php endforeach; ?>
    </tbody>
    

    功能正常。感谢你们帮助我解决了一些我忽略的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多