-1

我正在使用 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 | 这将失败 否或开 | 在我的数据库中关闭为 varchars 而不是布尔值?

更新:根据 Rays 的回答,我将更改状态以接受以下值。

publish
future
draft
pending
private
trash

我还更新了我的控制器,见上文。

4

1 回答 1

1

老实说,您的方法非常好,最好选择 ON OFF 选项,因为如果您想适应新状态,数字可能会变得复杂,

让我们举这个例子,

出于某种原因,您的经理向您的系统添加了另外 3 个统计数据,比如说 0、1、2、3、4

意思是

  • 0 关闭
  • 1 开启
  • 2 待定
  • 3 损坏
  • 4 被取消

将来您将无法根据他们的号码记住状态,但是如果您改用名称,则可以更好地理解。

最后,为了稳定,坚持已知结构。

于 2018-08-13T11:08:02.437 回答