关系数据库和CodeIgniter

时间:2014-12-04 14:25:11

标签: php codeigniter relational-database

我使用CodeIgniter构建网站,我想从数据库表中显示构建项目列表,我们只需调用project_table。对于每个项目,我还有一个地址,存储在另一个表address_table中,每个地址都有project_id,将其链接到项目。

我在我的项目模型中创建了一个函数get_projects,用于获取项目信息并将其传递给项目视图,如下所示:

public function index() {
    $data['projects'] = $this->project_model->get_projects();
    $data['title'] = 'Ejendomme';
    $this->load->view('templates/header', $data);
    $this->load->view('projects/index', $data);
    $this->load->view('templates/footer');
}

我的问题是我如何获取地址,链接到正确的项目并显示。我想我可以创建一个从视图调用的函数,它根据project_id加载地址,但据我所知,这是非常糟糕的做法。有没有办法从控制器调用get_address函数,并将其传递给视图,而不会丢失哪个地址属于哪个项目?

更新 这里的每个请求是函数get_project(),它从数据库中获取项目信息。我考虑在其中调用get_address()函数,但我不确定如何从函数中返回地址。

// Function to read all projects from database
public function get_projects() {
    $query = $this->db->get('project_table');
    return $query->result_array();
}

3 个答案:

答案 0 :(得分:2)

如果您从模型中发布了get_projects方法,则更有用。无论如何,诀窍是利用模型 - 视图 - 控制器(MVC)架构,因此您可以从模型中选择数据库。 下面是一个从这两个表中提取数据的方法示例:

public function get_projects()
{
//for standard mySQL
//select only the db fields that you need
$query = "SELECT pt.*, at.* FROM project_table as pt, address_table as at WHERE pt.project_id = at.project_id";
$db_result = $this->db->query($query);
$result_object = $db_result->result();
/*
here you can add a check for the result (for instance to check if the return is not empty)
*/
return $result_object;
}

现在将结果解析为视图并从那里播放数据。

答案 1 :(得分:2)

加入前面答案中的想法,您可以使用查询构建器(使用CI 3名称)连接这两个表,并从模型中返回该方法所需的所有信息:

public function get_projects() {
    $this->db->from('project_table');
    $this->db->join('adress_table', 'adress_table.project_id', 'project_table.id');

    return $this->db->get()->result_array();
}

您可以在documentation了解有关QueryBuilder类的更多信息。

答案 2 :(得分:1)

理想情况下,您希望将所有数据库查询保留在模型中。您可以使用$ this-> function_name()。

调用模型中的其他函数

我相信这会实现你的目标(这些在你的模型中):

// Function to read all projects from database
public function get_projects() {
    $results = $this->db->get('ed_projects')->result();
    foreach($results as $r) {
        $r->address = $this->get_address($r->id);
    }
    return $results;
}

// Function to read addresses for a $project_id
private function get_address($project_id) {
    return $this->db->from('project_address_table')
                ->where('project_id', $project_id)
                ->get()->result();
}

我还建议使用codeigniter活动记录类(http://www.codeigniter.com/user_guide/database/active_record.html)来执行这样的简单数据库查询,因为它可以更容易地查看您的查询正在做什么