#php #arrays #database #string #codeigniter
#php #массивы #База данных #строка #codeigniter
Вопрос:
Я пытаюсь получить данные из базы данных на основе , manager и project_name, в основном я хочу получить все задачи по всем проектам конкретного менеджера, я успешно смог получить все проекты, но при попытке получить задачи по всем этим проектам возникает ошибка:
Вот контроллер
function index()
{
// print_r($_REQUEST);
// die;
$user_id = $this->session->userdata('manager');
$project_manager = $this->task_model->getmanager($user_id);
// print_r($project_manager);
// die;
$project_name = $this->task_model->getProjectDetails($project_manager);
// print_r($project_name);
// die;
$data['tasks'] = $this->task_model->getTasksDetails($project_name); //error on this line
// print_r($data);
// die;
Вот модель:
function getmanager($user_id)
{
$first_name =$this->db->select('first_name')->from('user_login')->where(array('id' => $user_id,'delete_flag'=>0))->get()->row();
return $first_name->first_name;
}
function getProjectDetails($project_manager)
{
//table (projects)
$delete_flag=1;
$project_name =$this->db->get_where('projects',array('delete_flag!='=>$delete_flag,'project_manager'=>$project_manager))->result();
return $project_name;
}
function getTasksDetails($project_name)
{
$this->db->select('*,tasks.id as id, tasks.status as status');
$this->db->join('user_login', 'tasks.assign_to = user_login.id');
$this->db->where('tasks.delete_flag','0');
$this->db->where('tasks.project_name' ,$project_name);
return $this->db->get('tasks')->result(); //error on this line
// return $tasks->tasks;
}
И запуск
print_r($project_name);
die;
Результаты:
Array (
[0] => stdClass Object (
[id] => 4
[delete_flag] => 0
[project_name] => a test
[client_name] => a
[company] => AIM Solutions Sdb Bhd
[project_manager] => Ravi
[support_staff] => elango,test2
[flag] => 3
)
[1] => stdClass Object (
[id] => 5
[delete_flag] => 0
[project_name] => test project
[client_name] => test
[company] => AIM Solutions Sdb Bhd
[project_manager] => Ravi
[support_staff] => elango,test2,mani
[flag] => 0
)
)
был бы признателен, если кто-нибудь может помочь.
Комментарии:
1. вы не можете передавать
array
данныеwhere
, вы можете передать массив идентификаторов вwhere_in
Ответ №1:
Вы отправляете массив / объект в свою функцию getTasksDetails(), когда эта функция должна получить строку.
Эта строка здесь:
$project_name = $this->project_model->getProjectDetails($project_manager);
Должно быть:
$project_name = $this->project_model->getProjectDetails($project_manager[0]->project_manager);
Однако я бы пошел еще дальше и изменил вашу функцию, которая возвращает менеджеру проекта, чтобы возвращать только одну строку вместо результата.
Из того, что я вижу, я подозреваю, что вы возвращаете $foo-> result() для этой функции, вместо этого измените ее на $foo-> row();
Затем вместо использования
$project_manager[0]->project_manager
вы бы просто использовали:
$project_manager->project_manager
Это решение, очевидно, основано на том факте, что вам могут потребоваться сведения о проектах только для одного менеджера проекта.
Если вам нужны все сведения о проекте для группы менеджеров проектов, тогда вы можете настроить свой массив менеджеров проектов так, чтобы он был всего лишь одним массивом идентификаторов, а затем изменить свой запрос на использование where вместо where . Поэтому я просто предполагаю, что ваша функция getmanager, вероятно, неверна, поскольку вы отправляете user_id и получаете более одного результата.
Основываясь на ваших комментариях, в которых говорится, что вам нужны все задачи, связанные со всеми проектами данного менеджера проектов, вам нужно следующее:
// Controller Function
function index()
{
$user_id = $this->session->userdata('manager');
// return the project manager name
$project_manager = $this->task_model->getmanager($user_id);
// Return all the projects for a given project manager
$project_manager_projects = $this->task_model->getProjectDetails($project_manager);
// Get all tasks in a set of projects
$data['tasks'] = $this->task_model->getTasksDetails($project_manager_projects);
}
// Model functions
function getmanager($user_id)
{
$first_name =$this->db->select('first_name')
->from('user_login')
->where(array('id' => $user_id,'delete_flag'=>0))
->get()
->row();
return $first_name->first_name;
}
function getProjectDetails($project_manager)
{
$delete_flag=1;
$project_name = $this->db->get_where('projects',array(
'delete_flag != ' => $delete_flag,
'project_manager' => $project_manager)
)->result();
return $project_name;
}
function getTasksDetails($project_manager_projects)
{
$projects = array();
foreach($project_manager_projects as $project) {
$projects[] = $project->project_name;
}
if (empty($projects)) {
return array();
}
return $this->db->select('*,tasks.id as id, tasks.status as status')
->join('user_login', 'tasks.assign_to = user_login.id')
->where('tasks.delete_flag','0')
->where_in('tasks.project_name' ,$projects)
->get('tasks')
->result();
}
Чтобы ваш where_in работал, вам нужно использовать массив только с теми данными, которые вы используете, а не весь многомерный массив с большим количеством неиспользуемых полей.
Теперь этот код можно значительно улучшить, но для решения вашего вопроса этого должно быть достаточно.
Комментарии:
1. спасибо за ваше объяснение, но я все еще не смог устранить ошибку, я обновил код и добавил другие функции, был бы признателен, если бы вы могли взглянуть
2. ваша функция getProjectDetails возвращает много проектов вместо одного, вы этого хотите? Ваша цель здесь — получить все проекты от одного менеджера проектов и все задачи для данных проектов?
3. да, моя цель — получить все проекты от одного менеджера проектов, а затем все задачи для данных проектов
4. так что да, я хочу вернуть столько, сколько проектов от менеджера
5. хорошо, тогда я бы поступил немного по-другому. Я изменю свой ответ.