【问题标题】:Array to string conversion in Php CodeigniterPhp Codeigniter 中的数组到字符串转换
【发布时间】:2021-02-23 05:50:21
【问题描述】:

我正在尝试从数据库中获取数据,基于,经理和项目名称,基本上我想获取特定经理的所有项目下的所有任务,我成功地能够获取所有项目,但是当试图获取所有这些项目下的任务都出现错误:

这里是控制器

  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 
    ) 
 )

如果有人能提供帮助将不胜感激。

【问题讨论】:

  • 你不能在where中传递array数据,你可以在where_in中传递ID数组

标签: php arrays database string codeigniter


【解决方案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

此解决方案显然是基于您可能只需要一位项目经理的项目详细信息这一事实。

如果您想要的是一组项目经理的所有项目详细信息,那么您可能希望将您的项目经理数组调整为仅包含一个 id 数组,然后将您的查询更改为使用 where in 而不是 where。所以我只是假设你的函数 getmanager 可能是错误的,因为你发送了一个 user_id 并获得了多个结果。

根据您的cmets,说您需要的是与给定项目经理的所有项目相关的所有任务,您需要的是以下内容:

// 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 工作,您需要使用仅包含您正在使用的数据的数组,而不是包含许多未使用字段的整个多维数组。

现在这段代码可以改进很多,但要解决你的问题,这就足够了。

【讨论】:

  • 感谢您的解释,但我仍然无法解决错误,我已经更新了代码并添加了其他功能,如果您可以看看将不胜感激
  • 您的函数 getProjectDetails 返回许多项目,而不仅仅是一个,您想要吗?您的目标是从一位项目经理那里获得所有项目以及给定项目的所有任务?
  • 是的,我的目标是从一位项目经理那里获得所有项目,然后是给定项目的所有任务
  • 所以是的,我想从经理那里返回尽可能多的项目
  • 好的,那么我会做一些不同的事情。我会改变我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 2023-03-11
相关资源
最近更新 更多