SQL SELECT *但有一个扭曲 - CodeIgniter

时间:2012-10-01 14:43:29

标签: php sql codeigniter prepared-statement

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

快速修复将是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中我有很多控制器。一个用于“页面”,一个用于“产品”,一个用于“新闻”,一个用于打开。我不想在我的模型中为每个控制器创建单个数据库查询方法。

3 个答案:

答案 0 :(得分:0)

我认为没有4种方法的愿望是错误的。如果你没有方法中的信息,你将不得不传入它。所以你可以传入一个包含你想要的表的字符串,并切换根据表名更改查询,或传入查询的所有必要部分。这将包括表名,条件列,条件和要选择的列。并且每次调用函数时都需要传递该信息。这两种方法都不会真正为你节省太多代码,而且它们的可读性都低于每种用途的函数。

答案 1 :(得分:0)

模型的整个想法将您的特定查询放在那里的持久层。使用通用的catch-all方法可能是灾难性的,难以测试。你应该围绕你想要解决的问题塑造你的模型。

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

这是否有意义,或者我只是漫无目的......?

答案 2 :(得分: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
}