【问题标题】:Not looping correctly循环不正确
【发布时间】:2014-05-14 20:52:31
【问题描述】:

所以我访问数据库以检索员工 ID 列表,然后使用该员工 ID 数组对数据库上的另一个表运行查询,该表根据员工 ID 获取该人的所有信息,但我是只获取语句中的最后一个值,但我需要获取并循环所有这些值。谁能看到我的错误?

public function manager_list()
{
    $results = array();
    $managers = $this->db->query('select `employee_id` from `managers`');

    foreach($managers->result() as $row)
    {
        $employee_id = $row->employee_id;
    }

        $query = $this->db->query('select `employee_id`, `ssn`, `first_name`, `last_name`, `department`, `title`, `status` from `employees` where `employee_id` = "'.$employee_id.'"');

        foreach ($query->result() as $row){
            $results[] = array(
            'employee_id' => $row->employee_id,
            'ssn' => $row->ssn,
            'first_name' => $row->first_name,
            'last_name' =>$row->last_name,
            'department' =>$row->department,
            'title' =>$row->title,
            'status' =>$row->status,
        );
        }
    return $results; 
}

这是使用代码点火器框架。

【问题讨论】:

  • 您需要在获得员工 ID 后将右大括号移动到退货的正上方。第二个查询(和循环)需要在第一个循环的大括号内。
  • 1. for 循环的结束 } 放错了位置。 2. 当然,这可以通过使用 JOIN 的单个 SQL 查询而不是循环中的一大堆查询来完成。
  • 我不确定我理解你的意思@MarkS。
  • 为什么不在查询中加入?您是否需要运行两个查询?
  • @JayBlanchard 是的,我需要运行两个查询,但第一个查询的结果会影响第二个查询的结果。

标签: php database codeigniter mysqli


【解决方案1】:

如果您在单个查询中执行此操作,则可以进一步缩短它,但由于您说您必须有两个,这里是您的第二个查询的简短版本,不需要 foreach 循环:罢工>

$query = $this->db->query('
select `employee_id`, `ssn`, `first_name`, 
       `last_name`, `department`, `title`, `status` 
from `employees` where `employee_id` = "'.$employee_id.'"');

return $query->result_array(); 

使用活动记录:

return $this->db
->select('`employee_id`, `ssn`, `first_name`, 
       `last_name`, `department`, `title`, `status`')
->where(array('employee_id' => $employee_id))
->get('employees')
->result_array();

更新

这是一个带有 JOIN 的简短版本(替换您的整个代码):

public function manager_list()
{
    return $this->db
    ->select('e.employee_id, e.ssn, e.first_name, 
              e.last_name, e.department, e.title, e.status')
    ->join('managers AS m', 'e.employee_id = m.employee_id')
    ->where(array('e.employee_id' => $employee_id))
    ->get('employees AS e')
    ->result_array();
}

【讨论】:

  • 有没有办法通过加入来做到这一点?
  • 是的,但是你在 cmets 中说你想要两个查询...你想要一个连接版本吗?
  • id 也可以看到一个连接,技术上不必是两个
  • 好吧,在这种情况下使用 JOINS 似乎很自然。我以为你有一些具体的理由不这样做。
  • 不客气!好吧,这几乎是连接的主要用法——一个教科书的例子。它们是一个非常强大的工具,我强烈建议您了解所有这些工具(左、右、内、外……)。
【解决方案2】:

使用 JOIN 执行一次查询并执行一次循环 -

public function manager_list()
{
    $results = array();
    $managers = $this->db->query('SELECT `m`.`employee_id`, `e`.`ssn`, `e`.`first_name`, `e`.`last_name`, `e`.`department`, `e`.`title`, `e`.`status` FROM `managers` AS `m` JOIN `employees` AS `e` ON `m`.`employee_id` = `e`.`employee_id`');

    foreach ($managers->result() as $row){
        $results[] = array(
            'employee_id' => $row->employee_id,
            'ssn' => $row->ssn,
            'first_name' => $row->first_name,
            'last_name' =>$row->last_name,
            'department' =>$row->department,
            'title' =>$row->title,
            'status' =>$row->status,
        );
    }
    return $results;
}

【讨论】:

  • 我相信整个 foreach 部分有点多余,因为它完全符合原生 CI 方法 result_array() 的作用,对吧?
  • 是的,它是多余的。我只是对 OP 的代码进行了足够的更改,以说明关于 JOIN 的要点。 BTW +1 为您提供出色的优雅解决方案@Shomz
  • 当然,当然,只是检查,因为我从头顶写下了我的答案,没有经过测试。 :) 谢谢,您的解决方案也很好! +1
  • 感谢@Shomz 和 Jay 告诉我 foreach 是多余的。我不知道这是因为我第一次查找如何使用代码点火器返回数组时使用的是 foreach。你为我节省了一些时间和代码。
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多