我正在使用CodeIgniter构建我的api,并且我试图找到允许发送多个参数的最佳方法,以便在存在它们的情况下运行我的Model where子句。我遇到了一些问题,如果有人可以提供一些建议的最佳做法,我将不胜感激,因为我的整个安装过程变得肿。
我的查询可以采用以下参数:
/v1/tags?status=1&parentId=1&order=desc&limit=10&offset=1
这是我的桌子。
id int(11) NO PRI auto_increment
parentId int(11) NO
name varchar(250) NO
status tinyint(4) NO
createdDate timestamp NO CURRENT_TIMESTAMP
这是我的控制者。
/**
* READ TAGS
*/
public function tags_get() {
// OPTIONALS:
$parentId = $this->get('parentId');
$status = $this->get('status');
// DEFAULTS:
$offset = $this->get('offset');
$order = $this->get('order');
$limit = $this->get('limit');
// WHERE QUERY:
$where = [];
// VALIDATE:
if(isset($status)){
if ($status != 'publish' && $status != 'future' && $status != 'draft' && $status != 'pending' && $status != 'private' && $status != 'trash') {
$this->response(array(
'status' => FALSE,
'message' => '(status) must be one of the following (publish|future|draft|pending|private|trash)'
), REST_Controller::HTTP_OK);
}
// ADD TO QUERY:
$where['status'] = $status;
}
if(isset($parentId)){
if (filter_var($parentId, FILTER_VALIDATE_INT) === false) {
$this->response(array(
'status' => FALSE,
'message' => '(parentId) must be int'
), REST_Controller::HTTP_BAD_REQUEST);
}
// ADD TO QUERY:
$where['parentId'] = $parentId;
}
// IF NO PARAMS RETUNR ALL DATA
$data = $this->user_model->get_tags($where, $order, $offset, $limit);
if($data){
$this->response([
'status' => TRUE,
'message' => 'Success',
'paging' => $offset,
'records' => count($data),
'data' => $data,
], REST_Controller::HTTP_OK);
}else{
$this->response([
'status' => FALSE,
'message' => 'Not found',
'data' => []
], REST_Controller::HTTP_NOT_FOUND);
}
}
这是我的模特
function get_tags($where = [], $order = 'desc', $offset = 0, $limit = 100){
// MAIN QUERY:
$this->db->select('*');
$this->db->from('tags');
// OPTIONAL WHERE QUERIES:
foreach ($where as $key => $value) {
$this->db->where($key, $value);
}
// DEFUALTS:
$this->db->order_by('createdDate', $order);
$this->db->limit($limit, $offset);
$query = $this->db->get();
return ($query->num_rows() > 0) ? $query->result_array() : FALSE;
}
进行以下查询。
/v1/tags?status=0
如果我使用YES,则会失败。否或开|是在我的数据库中以varchar的形式关闭,而不是布尔值?
更新: 根据Rays的回答,我将更改状态以接受以下值。
publish
future
draft
pending
private
trash
我还更新了我的控制器,见上文。
答案 0 :(得分:1)
坦白地说,您的方法相当好,最好选择ON OFF,因为如果您想适应新的状态,数字可能会变得复杂
让我们举个例子,
由于某种原因,您的经理向您的系统添加了3个统计信息,比方说0、1、2、3、4
这意味着
将来您将无法根据其编号记住状态,但是如果改用名称,则可以更好地理解。
最后,为了稳定起见,请坚持使用已知的结构。