Codeigniter передает массив от контроллера к модели, но не возвращает совпадающий результат - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь отправить массив данных с контроллера на модель. но когда я печатаю_r на контроллере, я не получаю соответствующий "employee_code" для соответствующего "used_id".

Мой контроллер

Controller:

    $get_userid = $this->report->get_users_from_manager_id($this->session_user_id);
    $data["permit_user_id"] = $get_userid;
    foreach($get_userid as $user){
    $data["get_employee_code"] = $this->report->get_user_employee_code($user['user_id']);
    }

Моя модель:

Model:

 /**Get User_id From the Manager id */
public function get_users_from_manager_id($manager_d){
    // $output = array();
    $sql = 'SELECT * FROM manager WHERE manager_id = "'.$manager_d.'"';
    $query = $this->db->query($sql);

    if ($query->num_rows() > 0) {
        $data = $query->result_array();
    }
    return $data;
}
 public function get_user_employee_code($user_id)
{
    $sql = 'SELECT * FROM user WHERE user_id = "'.$user_id.'"';
    $query = $this->db->query($sql);

    if ($query->num_rows() > 0) {
        $data = $query->result_array();
    }
    return $data;
}

Мои взгляды:

Views:

foreach($permit_user_id as $user){
    foreach($get_employee_code as $employee_code){
        print_r("User_id:".$user['user_id']."  Employee_code:".$employee_code['employee_code']."<br>");
    }
}

Диспетчер таблиц

 id     user_id     manager_id
  1     10001       20000
  2     10002       20000
  3     10003       20000
  4     10004       20000
  5     10005       20000
  6     10006       20000

Пользователь таблицы:

  id    user_id     employee_code
  1     10001       500001
  2     10002       500002
  3     10003       500003
  4     10004       500004
  5     10005       500005
  6     10006       500006

Вывод, что я получил

 User_id: 10001 Employee_code: 500006
 User_id: 10002 Employee_code: 500006
 User_id: 10003 Employee_code: 500006
 User_id: 10004 Employee_code: 500006
 User_id: 10005 Employee_code: 500006
 User_id: 10006 Employee_code: 500006

Вывод что мне нужно:

 User_id: 10001 Employee_code: 500001
 User_id: 10002 Employee_code: 500002
 User_id: 10003 Employee_code: 500003
 User_id: 10004 Employee_code: 500004
 User_id: 10005 Employee_code: 500005
 User_id: 10006 Employee_code: 500006

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Здесь вы ошибаетесь:

foreach($get_userid as $user){
    $data["get_employee_code"] = $this->report->get_user_employee_code($user['user_id']);
}

Здесь вы перезаписываете $data["get_employee_code"] с каждой итерацией. В конце все, что осталось в этом массиве, является последним значением, "500006". Вероятно, вы хотели сделать следующее:

$data["get_employee_code"][] = // <- note the extra brackets

Но я также чувствую, что вы неправильно выводите свое представление:

foreach($permit_user_id as $user){
    foreach($get_employee_code as $employee_code){
        print_r("User_id:".$user['user_id']."  Employee_code:".$employee_code['employee_code']."<br>");
    }
}

Это означает, что для каждого пользователя вы также выведите каждый идентификатор сотрудника, а не только идентификатор этого пользователя, в результате чего:

 User_id: 10001 Employee_code: 500001
 User_id: 10001 Employee_code: 500002
 User_id: 10001 Employee_code: 500003
 User_id: 10001 Employee_code: 500004
 User_id: 10001 Employee_code: 500005
 User_id: 10001 Employee_code: 500006

 User_id: 10002 Employee_code: 500001
 User_id: 10002 Employee_code: 500002
 User_id: 10002 Employee_code: 500003
 User_id: 10002 Employee_code: 500004
 User_id: 10002 Employee_code: 500005
 User_id: 10002 Employee_code: 500006

 ... and so on ...

Вместо всего этого вам нужно написать один запрос, который получает все необходимые данные в модели:

public function get_user_and_employee_ids_from_manager_id($manager_id){
    $sql = 'SELECT user.user_id, user.employee_id FROM user JOIN manager ON user.user_id = manager.user_id WHERE manager.manager_id = "'.$manager_id.'"';
    $query = $this->db->query($sql);

    if ($query->num_rows() > 0) {
        $data = $query->result_array();
    }
    return $data;
}

Теперь этот $data - это массив, содержащий строки с парными идентификаторами пользователей и сотрудников, которые вы можете передать в свое представление и просто вывести, используя один foreach.

Кроме того, я не знаю, что используется в фоновом режиме для запросов в БД, но найду способ параметризации ваших запросов. Непосредственная вставка параметров в запрос, подобный этому, unsafe .

0 голосов
/ 29 марта 2020

Попытка добиться этого в одном запросе может уменьшить ненужные вызовы l oop и db.

SELECT 
  a.`manager_id`,
  a.`user_id`,
  b.`employee_code` 
FROM
  `manager` AS a 
  INNER JOIN `user` AS b 
    ON a.`user_id` = b.`user_id`
ORDER BY a.`manager_id` ASC,
  a.`id` ASC ;

Как только данные достигнут для просмотра.

Вы можете использовать ЭТО

ИЛИ

  • Объявление массива для manager_id.
  • l oop результат
  • вы дифференцируете manager_id, проверяя вызов in_array.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...