【发布时间】:2017-10-26 04:36:08
【问题描述】:
这已经困扰了我很长一段时间了。
据我所知,控制器是我进行验证、模型调用和数据显示的地方。而在只有一个目的的模型上,是我进行 SQL 查询的地方。
但是模型的最佳方法是什么?我是否必须使用不同的条件/方法创建很多函数,或者我必须在一个函数中完成所有这些,专门用于我数据库中的单个表。以下面的代码为例:
多功能:
class Sword_model extends CI_Model {
public function __construct()
{
$this->load->database();
$this->load->library('session');
$this->load->helper('url_helper');
}
public function getsword($swordid = NULL)
{
if($swordid === NULL){
$query = $this->db->query("SELECT * FROM sword_tb");
return $query->result_array();
}
$query = $this->db->query("SELECT * FROM sword_tb WHERE sword_id = ?", array($swordid));
return $query->row_array();
}
public function getstrongswords($strong = NULL)
{
if($strong === NULL){
return false;
}
$query = $this->db->query("SELECT * FROM sword_tb WHERE strong = ?", array($strong));
return $query->result_array();
}
/*** AND MORE SUCCEEDING FUNCTIONS BELOW FOR DIFFERENT COLUMNS/CONDITIONS ***/
}
优点:这很简单,更容易理解(我认为更快)
缺点:您必须为不同的条件/列手动创建函数
单一功能:
class Sword_model extends CI_Model {
public function __construct()
{
$this->load->database();
$this->load->library('session');
$this->load->helper('url_helper');
}
public function getsword($column = NULL, $value = NULL, $condition = 'AND')
{
$query = 'SELECT * FROM sword_tb';
$count = count($column);
for($x = 0; $x < $count; $x++){
if($x > 0){
$query .= ' '.$condition;
} else {
$query .= ' WHERE (';
}
$query .= ' '.$column[$x].' = ?';
}
$query .= ' ORDER BY sword_name';
$query = $this->db->query($query, $value);
return $query->result_array();
}
}
使用这种单函数方法,您可以通过将数组作为参数来调用该函数,如下所示:
$this->Sword_model->getsword(array('sword', 'strong'), array(3, 1), 'OR');
查询将如下所示:
SELECT * FROM sword WHERE (sword = ? OR strong = ?) ORDER BY sword_name
如果您将其留空,查询将如下所示:
SELECT * FROM sword ORDER BY sword_name
优点: 灵活
缺点: 比第一种方法慢(?)
两者之间更理想的是什么?或者还有其他更理想的方式吗?
【问题讨论】:
-
作为 CI 用户,我建议使用像
db->get或db->query这样的直接访问。这两者都工作得更快。 CI 也是整个 PHP 框架中的可定制框架。如果您需要更好的模型,您可以使用第三方模型或框架,例如 LARAVEL、Symfony -
大多数时候我使用
db->get来选择数据或做任何事情。但是db->query是用于巨大查询(更多+1 连接)的最佳选择 -
@Logan Wayne,你的 cmets 你有答案吗?
标签: php codeigniter