好吧我想说我想从数据库表中选择多个列,但我不知道这些列在方法中是什么。我可以传入它们,但它可能或多或少取决于调用数据库方法的方法。
快速修复将是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中我有很多控制器。一个用于“页面”,一个用于“产品”,一个用于“新闻”,一个用于打开。我不想在我的模型中为每个控制器创建单个数据库查询方法。
答案 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
}