Я использую 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
Это не удается, если я использую ДА | НЕТ или ВКЛ | OFF как varchars в моей базе данных вместо логических значений?
ОБНОВИТЬ:
На основании ответа Rays я буду менять статус, чтобы принять следующие значения.
publish
future
draft
pending
private
trash
Я также обновил свой контроллер, см. Выше.
Если честно, ваш подход достаточно хорош, лучше выбрать ON OFF, так как числа могут усложниться, если вы хотите адаптировать новые состояния,
Давайте возьмем этот пример,
По какой-то причине ваш менеджер добавил еще 3 статистики в вашу систему, скажем, 0,1,2,3,4
что значит
вы не сможете вспомнить статус в зависимости от их количества в будущем, но если вы будете использовать вместо них имена, вы сможете лучше понять.
В конце концов, ради стабильности придерживайтесь известной структуры.
Других решений пока нет …