thinkcmf5 學習筆記


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;
    }
View Code

 

 

// 設置分頁
        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;
    }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM