我正在使用CodeIgniter来构建我的api,我正在尝试找到允许发送多个参数的最佳方法,然后运行我的模型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
如果我使用"是 |否或打开 |关闭作为我数据库中的 varchar 而不是布尔值?
更新: 根据 Rays 的回答,我将更改状态以接受以下值。
publish
future
draft
pending
private
trash
我还更新了我的控制器,见上文。
老实说,你的方法非常好,最好选择ON OFF,因为如果你想适应新的状态,数字可能会变得复杂,
让我们以这个例子为例,
出于某种原因,您的经理在您的系统中又添加了 3 个统计数据,例如 0,1,2,3,4
这意味着
- 0 表示关闭
- 1 已打开
- 2 挂起
- 3 损坏
- 4 被取消
将来您将无法根据他们的号码记住状态,但是如果您改用名称,则可以更好地理解。
最后,为了稳定性,坚持使用已知的结构。