1、api里如何傳遞頁碼和每頁記錄數 data :{category_id: '{$category.id}',page:++count+',10'},
page參數傳遞頁碼+數量,例如 page=‘1,10’ 取第一頁 每頁10條記錄
api ListsController.php getCategoryPostLists()方法
$articles = $portalCategoryModel->paramsFilter($param, $findCategory->articles()->alias('post'))->select();
$findCategory = $portalCategoryModel->where('id', $categoryId)->find(); //獲取當前分類MODEL,返回數據類型MODEL對象。
$findCategory->articles()->alias('post')
在portalCategoryModel.php里定義了articles方法
/**
* 關聯文章表
* @return $this
*/
public function articles()
{
return $this->belongsToMany('PortalPostModel', 'portal_category_post', 'post_id', 'category_id'); //belongsToMany 多表關聯,
}
alias 方法 設置表的別名。 為什么要設置別名呢,有啥作用??
paramsFilter方法 關聯模型解析過濾參數,解析的參數:field 字段(select 。。。。from),ids (id in 。。。),id(id=。。),where 條件表達式( and 。。。。),page分頁,limit(數量)。page參數存在時,limit參數無效。
這里只解析了頁數,沒有解析每頁顯示的數量,系統默認了20個,不知道怎么通過參數更改這個默認值。
/**
* @access public
* @param array $params 過濾參數
* @param model $model 關聯模型
* @return model|array $this|鏈式查詢條件數組
*/
public function paramsFilter($params, $model = null)

/** * @access public * @param array $params 過濾參數 * @param model $model 關聯模型 * @return model|array $this|鏈式查詢條件數組 */ public function paramsFilter($params, $model = null) { if (!empty($model)) { $_this = $model; } else { $_this = $this; } if (isset($_this->visible)) { //model 里設置的可暴露字段??? $whiteParams = $_this->visible; } // 設置field字段過濾 if (!empty($params['field'])) { $filterParams = $this->strToArr($params['field']); if (!empty($whiteParams)) { $mixedField = array_intersect($filterParams, $whiteParams); //比較兩個數組的鍵值,並返回交集 ,指定的字段並且是可暴露的。 } else { $mixedField = $filterParams; } if (!empty($mixedField)) { $_this->field($mixedField); //model的field方法???? } } // 設置id,ids if (!empty($params['ids'])) { $ids = $this->strToArr($params['ids']); foreach ($ids as $key => $value) { $ids[$key] = intval($value); } } if (!empty($params['id'])) { $id = intval($params['id']); if (!empty($id)) { return $_this->where('id', $id); } } elseif (!empty($ids)) { $_this->where('id', 'in', $ids); } if (!empty($params['where'])) { if (empty($model)) { $_this->where($params['where']); } } // 設置分頁 if (!empty($params['page'])) { $pageArr = $this->strToArr($params['page']); $page = []; foreach ($pageArr as $value) { $page[] = intval($value); } if (count($page) == 1) { $_this->page($page[0]); } elseif (count($page) == 2) { $_this->page($page[0], $page[1]); } } elseif (!empty($params['limit'])) { // 設置limit查詢 $limitArr = $this->strToArr($params['limit']); $limit = []; foreach ($limitArr as $value) { $limit[] = intval($value); } if (count($limit) == 1) { $_this->limit($limit[0]); } elseif (count($limit) == 2) { $_this->limit($limit[0], $limit[1]); } } else { $_this->limit(10); } //設置排序 if (!empty($params['order'])) { $order = $this->strToArr($params['order']); foreach ($order as $key => $value) { $upDwn = substr($value, 0, 1); $orderType = $upDwn == '-' ? 'desc' : 'asc'; $orderField = substr($value, 1); if (!empty($whiteParams)) { if (in_array($orderField, $whiteParams)) { $orderWhere[$orderField] = $orderType; } } else { $orderWhere[$orderField] = $orderType; } } if (!empty($orderWhere)) { $_this->order($orderWhere); } } return $_this; }
// 設置分頁
if (!empty($params['page'])) {
$pageArr = $this->strToArr($params['page']); //strToArr方法 用,分割字符串成數組。 $page = []; foreach ($pageArr as $value) { $page[] = intval($value); } if (count($page) == 1) { $_this->page($page[0]); } elseif (count($page) == 2) { $_this->page($page[0], $page[1]); //page給了兩個參數,第一個是頁碼,第二個應該就是每頁數量,think 的parseExpress方法里list($page, $listRows) = $options['page'];
$options['page']
} } elseif (!empty($params['limit'])) { // 設置limit查詢 $limitArr = $this->strToArr($params['limit']); $limit = []; foreach ($limitArr as $value) { $limit[] = intval($value); } if (count($limit) == 1) { $_this->limit($limit[0]); } elseif (count($limit) == 2) { $_this->limit($limit[0], $limit[1]); } } else { $_this->limit(10); }
thinkphp 的think/db/query.php select 方法有一段,根據page參數解析limit
$options = $this->parseExpress(); //解析options
parseExpress方法如下代碼
if (isset($options['page'])) {
// 根據頁數計算limit
list($page, $listRows) = $options['page']; //list方法 把數組中的值復制給變量,參考: http://www.w3school.com.cn/php/func_array_list.asp
$page = $page > 0 ? $page : 1; //初始化page
$listRows = $listRows > 0 ? $listRows : (is_numeric($options['limit']) ? $options['limit'] : 20); // $options['page']參數里包含了每頁的數量,沒有就讀取limit里指定的數量
$offset = $listRows * ($page - 1); //排除的記錄數,
$options['limit'] = $offset . ',' . $listRows; // $listRows 默認20 第一頁:0,20 第二頁:20,20 從20條記錄開始讀取20條
}
}
parseExpress 方法:

/** * 分析表達式(可用於查詢或者寫入操作) * @access protected * @return array */ protected function parseExpress() { $options = $this->options; // 獲取數據表 if (empty($options['table'])) { $options['table'] = $this->getTable(); } if (!isset($options['where'])) { $options['where'] = []; } elseif (isset($options['view'])) { // 視圖查詢條件處理 foreach (['AND', 'OR'] as $logic) { if (isset($options['where'][$logic])) { foreach ($options['where'][$logic] as $key => $val) { if (array_key_exists($key, $options['map'])) { $options['where'][$logic][$options['map'][$key]] = $val; unset($options['where'][$logic][$key]); } } } } if (isset($options['order'])) { // 視圖查詢排序處理 if (is_string($options['order'])) { $options['order'] = explode(',', $options['order']); } foreach ($options['order'] as $key => $val) { if (is_numeric($key)) { if (strpos($val, ' ')) { list($field, $sort) = explode(' ', $val); if (array_key_exists($field, $options['map'])) { $options['order'][$options['map'][$field]] = $sort; unset($options['order'][$key]); } } elseif (array_key_exists($val, $options['map'])) { $options['order'][$options['map'][$val]] = 'asc'; unset($options['order'][$key]); } } elseif (array_key_exists($key, $options['map'])) { $options['order'][$options['map'][$key]] = $val; unset($options['order'][$key]); } } } } if (!isset($options['field'])) { $options['field'] = '*'; } if (!isset($options['data'])) { $options['data'] = []; } if (!isset($options['strict'])) { $options['strict'] = $this->getConfig('fields_strict'); } foreach (['master', 'lock', 'fetch_pdo', 'fetch_sql', 'distinct'] as $name) { if (!isset($options[$name])) { $options[$name] = false; } } foreach (['join', 'union', 'group', 'having', 'limit', 'order', 'force', 'comment'] as $name) { if (!isset($options[$name])) { $options[$name] = ''; } } if (isset($options['page'])) { // 根據頁數計算limit list($page, $listRows) = $options['page']; $page = $page > 0 ? $page : 1; $listRows = $listRows > 0 ? $listRows : (is_numeric($options['limit']) ? $options['limit'] : 20); $offset = $listRows * ($page - 1); $options['limit'] = $offset . ',' . $listRows; } $this->options = []; return $options; }