Php 关系数据库和CodeIgniter

Php 关系数据库和CodeIgniter,php,codeigniter,relational-database,Php,Codeigniter,Relational Database,我正在使用CodeIgniter构建一个网站,我想显示一个数据库表中的建设项目列表,我们称之为project_table。对于每个项目,我还有一个地址,存储在另一个表address\u table中,每个地址都有一个project\u id,它将它链接到一个项目 我在我的项目模型中创建了一个函数get_projects,用于获取项目信息并将其传递到项目视图,如下所示: public function index() { $data['projects'] = $this->proj

我正在使用CodeIgniter构建一个网站,我想显示一个数据库表中的建设项目列表,我们称之为project_table。对于每个项目,我还有一个地址,存储在另一个表address\u table中,每个地址都有一个project\u 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();
}

如果您发布了“从模型获取项目”方法,则更有用。无论如何,诀窍是利用Model-View-ControllerMVC体系结构,因此您将从数据库中选择的内容放入模型中。 下面是一个示例,其中包含从这两个表中提取数据的方法:

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;
}

现在,将结果解析到一个视图中,并从那里播放数据。

如果您发布了“从模型获取项目”方法,则更有用。无论如何,诀窍是利用Model-View-ControllerMVC体系结构,因此您将从数据库中选择的内容放入模型中。 下面是一个示例,其中包含从这两个表中提取数据的方法:

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;
}

现在将结果解析到一个视图中,并从那里播放数据。

理想情况下,您希望将所有数据库查询保留在模型中。您可以使用$this->function\u 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 active record类来执行类似这样的简单数据库查询,因为这样可以更容易地查看您的查询正在执行的操作

理想情况下,您希望将所有数据库查询保留在模型中。您可以使用$this->function\u 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 active record类进行类似这样的简单数据库查询,因为这样可以更容易地查看您的查询所做的事情

加入前面答案中的想法,您可以使用查询生成器使用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();
}

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

结合前面答案中的想法,您可以使用查询生成器使用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();
}

有关QueryBuilder类的更多信息,请访问。

谢谢您的回复,我已经为我的get\u projects函数添加了代码。pt.*和at`.*是什么意思?那是表名吗?例如,在我的示例中,project_table和address_table.*指的是表中的所有列,在上面的示例查询中被引用为pt,即project_table。我想我现在有点明白了。很抱歉,速度太慢了,以前没有见过这种语法。那么我将如何处理返回的结果对象的不同部分呢?请参见我的单独回答,希望helpspt和at是查询中这两个表的别名,例如:不写project_table.*表示从project_table表中选择所有列,您可以写pt.*如果您在表中添加别名关键字AS,例如project_table AS ptt感谢您的回复,我已经为我的get_projects函数添加了代码。pt.*和at`.*是什么意思?那是表名吗?例如,在我的示例中,project_table和address_table.*指的是表中的所有列,在上面的示例查询中被引用为pt,即project_table。我想我现在有点明白了。很抱歉,速度太慢了,以前没有见过这种语法。那么我将如何处理返回的结果对象的不同部分呢?请参见我的单独回答,希望helpspt和at是查询中这两个表的别名,例如:不写project_table.*表示从project_table表中选择所有列,您可以写pt.*如果您在表中添加别名关键字AS,例如project_table AS ptt,感谢您的回复。如果我让它工作,我会让你知道:-我可以让它从数据库中读取,使用上面的代码,但当我尝试使用代码时,我得到一个错误,说致命错误:不能使用stdClass类型的对象作为数组。。。。我也许应该提一下这个项目
地址表包含多个字段。在将所有字段作为数组返回之前,是否可以将这些字段与get_项目中的字段一起组织起来?您可以通过在$this->db之后添加->选择'field1,field2,field3'来选择要返回的字段。通过将->结果更改为->结果数组,可以使get\u address函数作为数组返回,方法与第一个函数相同。很抱歉,在我上面的示例中发生了错误,我将第一个函数更改为作为对象返回-将$r->address更改为$r['address'],这应该有效谢谢您的回复。如果我让它工作,我会让你知道:-我可以让它从数据库中读取,使用上面的代码,但当我尝试使用代码时,我得到一个错误,说致命错误:不能使用stdClass类型的对象作为数组。。。。我可能应该提到project\u address\u表包含多个字段。在将所有字段作为数组返回之前,是否可以将这些字段与get_项目中的字段一起组织起来?您可以通过在$this->db之后添加->选择'field1,field2,field3'来选择要返回的字段。通过将->结果更改为->结果数组,可以使get\u address函数作为数组返回,方法与第一个函数相同。很抱歉,在我上面的示例中发生了错误,我将第一个函数更改为作为对象返回-将$r->address更改为$r['address'],这应该可以工作