Codeigniter API 使用参数选项调用 WHERE Mysql 查询 PHP

Codeigniter API Get Call With Param Options For WHERE Mysql Query PHP

我正在使用 CodeIgniter 来构建我的 api 并且我正在尝试找到允许多个参数发送到 运行 我的模型 where 子句的最佳方法(如果它们存在)。我 运行 遇到了一些问题,如果有人可以额外提供一些最佳实践建议,我将不胜感激。我觉得我的整个设置都变得臃肿了。

我的查询可以采用以下参数:

/v1/tags?status=1&parentId=1&order=desc&limit=10&offset=1

这是我的table。

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

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

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

举个例子,

出于某种原因,您的经理向您的系统添加了 3 个统计数据,假设为 0,1,2,3,4

这意味着

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

以后你将无法根据他们的号码记住状态,但如果你用名字代替,你可以更好地理解。

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