Php 如何使用codeigniter从数据库中查询两个表并在一行中显示结果

Php 如何使用codeigniter从数据库中查询两个表并在一行中显示结果,php,mysql,sql,codeigniter,Php,Mysql,Sql,Codeigniter,我有两个表,一个用于用户,另一个用于项目列表 我的问题是,我想在一行上显示每个项目(来自project_表)和属于列出该项目(来自user_表)的用户的电子邮件 project_表有一行user_id(即user_表中标识发布项目的用户的id) 以下是我的观点(项目视图): 我在本例中显示了project_表中的数据,但我想显示user_表中特定用户的电子邮件 <?php foreach($query as $row) { ?> <p> <?echo

我有两个表,一个用于用户,另一个用于项目列表

我的问题是,我想在一行上显示每个项目(来自project_表)和属于列出该项目(来自user_表)的用户的电子邮件

project_表有一行user_id(即user_表中标识发布项目的用户的id)

以下是我的观点(项目视图): 我在本例中显示了project_表中的数据,但我想显示user_表中特定用户的电子邮件

<?php 
 foreach($query as $row)
 { 
?>
    <p> <?echo $row->pro_name ?></p>
<p> <?echo $row->duration ?></p>
<p> <?echo $row->budget ?></p>
<p>User email will be displayed here</p>
<?
 }
我的控制器:

function show_projects()
{
    $data['query']=$this->project_model->get_projects();
    $this->load->view('project_view', $data);
}

如果您有任何关于如何实现此功能的想法,我们将不胜感激

请尝试
join
this-


1)模型


2)控制器

$data['user_project'] = $this->project_model->get_projects();
$this->load->view($view, $data);

3)视图

foreach($user\u项目为$row)
{ 
回声“”$row->pro_name。”

”; 回声“”$row->duration.“

”; 回声“”$row->budget.“

”; 回显“”$row->email。”

”; }
您可以在模型中使用联接查询

function get_projects()
{

    $query =$this->db->select('p.*,u.email')
                 ->from('project_table p')
                 ->join('user_table u','p.user_id = u.id')
                 ->get();
     return $query->result();

}
在你看来,你可以这样做

<?php
foreach($query as $row)
{ 
?>
    <p> <?php echo $row->pro_name; ?></p>
    <p> <?php echo $row->duration; ?></p>
    <p> <?php echo $row->budget; ?></p>
    <p><?php  echo $row->email;?></p>

<?php
 }
?>


我将重写控制器和模型函数,以允许用户参数:

function get_projects($user=null)
{
    if ($user == null){
        $query = $this->db->get('project_table');
    }else{
        $query = $this>db->get('project_table')->where('user_id',$user);
    }
        return $query->result();
}


function show_projects($user)
{
    $data['query']=$this->project_model->get_projects($user);
    $this->load->view('project_view', $data);
}
现在,您可以使用用户参数调用控制器

http://..../show_user/1
第一种方法是连接

$this->db->select('project_table.* as project, user.id as user_id, user.email as email')
         ->from('project_table')
         ->join('user', 'project.id = user_id');
$result = $this->db->get();

不推荐使用第二种

function get_projects()
{
    $query = $this->db->get('project_table');
    return ($query->num_rows() > 0) ? $query->result() : FALSE;
}

function get_email($id = FALSE) {
    if ($id === FALSE) return FALSE;
    $query = $this->db->get_where('user', array('user_id' => $id));
    return ($query->num_rows() > 0) ? $query->result() : FALSE;
}
在控制器的某个地方

if (!$projects = $this->model->get_projects()) {

    foreach ($projects as $key => $project) {
        # code...
        $projects[$key]->user_email = $this->model->get_email($project->user_id);
    }

    //projects is now with user_email field
    $this->load->view()...

} else {

    //no data recieved
    redirect(); //redirect to default_controller
}

这可以通过联接或嵌套的foreach()完成。我将尝试演示这两种方法(作为回答)。
$this->db->select('project_table.* as project, user.id as user_id, user.email as email')
         ->from('project_table')
         ->join('user', 'project.id = user_id');
$result = $this->db->get();
function get_projects()
{
    $query = $this->db->get('project_table');
    return ($query->num_rows() > 0) ? $query->result() : FALSE;
}

function get_email($id = FALSE) {
    if ($id === FALSE) return FALSE;
    $query = $this->db->get_where('user', array('user_id' => $id));
    return ($query->num_rows() > 0) ? $query->result() : FALSE;
}
if (!$projects = $this->model->get_projects()) {

    foreach ($projects as $key => $project) {
        # code...
        $projects[$key]->user_email = $this->model->get_email($project->user_id);
    }

    //projects is now with user_email field
    $this->load->view()...

} else {

    //no data recieved
    redirect(); //redirect to default_controller
}