0

好的,可以说我想从数据库表中选择一些列,但我不知道这些列在方法中是什么。我可以将它们传递进去,但它可能或多或少取决于调用数据库方法的方法。

一个快速的解决方法是 SELECT *,但我知道这很糟糕,可能导致返回的数据多于必要的数据,而且我绝对不需要该表中的所有数据。

所以我正在使用 CodeIgniter 和准备好的语句来做到这一点,下面是我目前拥有的(它有效,只是指出这一点)。

function get_pages() {
        $this->db->select('pages.id, pages.title, pages.on_nav, pages.date_added, admin.first_name, admin.last_name')
                 ->from('pages, admin') 
                 ->where('pages.admin_id = admin.id')
                 ->order_by('pages.id', 'ASC');

        $query = $this->db->get();

        return $query->result();
    }

这是一个简单的功能,但目前仅限于获取“页面”。我也想将其转换为从其他表中获取。什么是最好的方法?

提前谢谢了。

编辑 在 CodeIgniter 中我有很多控制器。一个用于“页面”,一个用于“产品”,一个用于“新闻”,等等。我不想在我的模型中为每个控制器创建一个数据库查询方法。

4

3 回答 3

0

我认为没有 4 种方法的愿望是错误的。如果您在方法中没有信息,则必须将其传入。因此您可以传入带有所需表的字符串,然后根据表名切换更改查询,或者传入查询的所有必要部分。这将包括表名、条件列、条件和要选择的列。并且每次调用该函数时都需要传递该信息。这两种方法都不会真正为您节省大量代码,而且它们的可读性都低于用于每种目的的函数。

于 2012-10-01T15:13:59.393 回答
0

在您的模型中:

function get_pages($table_source) {
    $this->db->select($table_source.".id"); // or $this->db->select('id');

// for instance, if one of your $table_source ="users" and there is no 'title' column you can write
    if($table_source!='users') $this->db->select('title');

    $this->db->select('on_nav');
    $this->db->select('date_added');
    $this->db->select('admin.first_name');
    $this->db->select('admin.last_name'); 
    $this->db->join('admin','admin.id = '.$table_source.'.admin_id') 
    $this->db->order_by('pages.id', 'ASC');

    $query = $this->db->get($table_source);

    return $query->result_array();
}

在您的控制器中:

function all_tables_info() {
    $tables = array("pages","users","customers"); 
    $i=0;
    foreach($tables as $table) {
    $data[$i++]=$this->your_Model->get_pages($table);
 }
  //do somthing with $data
}
于 2012-10-02T21:30:58.570 回答
0

使用模型将您的特定查询放到其中的持久层的整个想法。使用通用的包罗万象的方法可能是灾难性的并且难以测试。你应该围绕你试图解决的问题来塑造你的模型。

这使它更清洁,更容易使用。同时,您还必须避免过度尺寸模型的常见陷阱。每个模型都应遵循 SRP。尝试分离关注点,以便在您的控制器中,您可以轻松查看状态更改。

这有意义还是我只是漫无目的......?

于 2012-10-01T15:20:41.150 回答