Я новичок в php, а также codeigniter. В основном я хочу, чтобы все проекты в таблице проекта отображались вместе с пользователями в этом проекте. ** В одном проекте может быть несколько пользователей или пользователь еще не назначен этому проекту. ** Поэтому я попытался реализовать его, но я не получаю желаемый результат. Пожалуйста, помогите мне !! Ниже приведен код:
Модель:
public function get_projects()
{
$sql = "SELECT * FROM 'project'";
$query = $this->db->query($sql);
return $query->result();
}
public function list_projects()
{
$project_result = $this->get_projects();
$sql = "select user_fname , project_id , user_id from user";
$query = $this->db->query($sql);
$user_result = $query->result();
$result_arr = array();
$proj_id_arr = array();
foreach($project_result as $curr_proj):
if(in_array($curr_proj->project_id, $proj_id_arr)){
$result_arr[$curr_proj->project_name][] = array(
'project_id ' => $curr_proj->project_id,
'project_name' => $curr_proj->project_name
);
}else{
$result_arr[$curr_proj->project_name][] = array(
'project_id ' => $curr_proj->project_id,
'project_name' => $curr_proj->project_name
);
}
foreach($user_result as $curr_user):
if($curr_user->project_id == $curr_proj->project_id):
$result_arr[$curr_proj->project_name][] = array(
'project_id ' => $curr_proj->project_id,
'project_name' => $curr_proj->project_name,
'user' => $curr_user->user_fname,
'user_id' => $curr_user->user_id
);
$proj_id_arr[] = $curr_proj->project_id;
endif;
endforeach;
endforeach;
echo '<pre>';
print_r($result_arr);exit;
return $data;
}
контроллер:
function index() {
$this->check_session();
$data['main_content'] = 'admin/project/list';
$data['lists']=$this->project_model->list_projects();
$data['projects']=$this->project_model->get_projects();
$data['result'] = false;
$this->load->view('common/admin_template', $data);
}
Это результат моего кода:
Array
(
[project 1 ] => Array
(
[0] => Array
(
[project_id ] => 1
[project_name] => project 1
)
[1] => Array
(
[project_id ] => 1
[project_name] => project 1
[user] => user1
[user_id] => 1
)
[2] => Array
(
[project_id ] => 1
[project_name] => project 1
[user] => user2
[user_id] => 2
)
)
[project 2] => Array
(
[0] => Array
(
[project_id ] => 19
[project_name] => project 2
)
[1] => Array
(
[project_id ] => 19
[project_name] => project 2
[user] => user3
[user_id] => 3
)
)
[project 3] => Array
(
[0] => Array
(
[project_id ] => 20
[project_name] => project 3
)
)
[project 4] => Array
(
[0] => Array
(
[project_id ] => 21
[project_name] => project 4
)
)
)
Существуют две таблицы: один из проектов, состоящий из project_id, project_description, а другой - с user_id, user_fname, project_id (внешний ключ)
Прежде всего, вы используете цикл внутри цикла. Это не очень хорошая практика. Используйте это, если вы хотите получить только проект, в котором есть хотя бы один пользователь. Затем установите $ showOnlyHaveUser = true. '
public function list_projects()
{
$showOnlyHaveUser = FALSE;
$project_result = $this->get_projects();
$sql = "select user_fname , project_id , user_id from user";
$query = $this->db->query($sql);
$user_result = $query->result();
$result_arr = array();
$proj_id_arr = array();
$projects = array();
foreach ($project_result as $project) :
$projects[$project->project_id] = $project;
if($showOnlyHaveUser==FALSE)
$result_arr[$project->project_name] = array();
endforeach;
foreach ($user_result as $user) :
$project_name = isset($projects[$user->project_id]) ? $projects[$user->project_id]->project_name : "";
$project_id = isset($projects[$user->project_id]) ? $projects[$user->project_id]->project_id : "";
if(!isset($result_arr[$project_name])):
$result_arr[$project_name] = array();
endif;
$temp = array(
'project_id ' => $project_id ,
'project_name' => $project_name,
'user' => $user->user_fname,
'user_id' => $user->user_id
);
$result_arr[$project_name][] = $temp;
endforeach;
echo '<pre>';
print_r($result_arr);exit;
return $data;
}'