【问题标题】:Codeigniter API Get Call With Param Options For WHERE Mysql Query PHPCodeigniter API 使用 WHERE Mysql Query PHP 的参数选项获取调用
【发布时间】:2018-08-13 10:57:58
【问题描述】:

我正在使用 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

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

【问题讨论】:

  • 您的模型查询是否正常工作?

标签: php mysql codeigniter codeigniter-query-builder codeigniter-restapi


【解决方案1】:

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

我们以这个例子为例,

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

意思是

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

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

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

【讨论】:

  • 谢谢,雷,这绝对是有道理的,你还建议使用 on |例如,对于一个只能为真和假的值的开关?我想它不会对数据库查询性能产生任何影响。
  • 可以,只要你确定你的价值观是真还是假。
  • 谢谢,Ray 只是想看看是否有其他人参与进来,然后不接受您的回答。
  • 不客气,兄弟,希望有人能和你分享一些想法,
猜你喜欢
  • 2016-02-16
  • 2010-09-24
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
相关资源
最近更新 更多