• Yii2笔记:activerecord和activecontroller


    官方资料:

    http://www.yiiframework.com/doc-2.0/guide-db-active-record.html

    http://www.yiiframework.com/doc-2.0/guide-rest-quick-start.html

    一些补充

    activecontroller的各种action是可以重载的,但必须先要unset掉父类的方法。

    比如下面这样,注意里面的actions()方法,如果这里没有unset掉父类方法的话,重载的function actionXXX不会起作用。

    <?php
    
    namespace appmodules
    estv2controllers;
    
    use Yii;
    use yiidataActiveDataProvider;
    use appmodelsdbTask;
    use appmodelsdbTaskSearch;
    
    class TaskController extends BaseActiveController
    {
        public $modelClass = 'appmodelsdbTask';
    
        public function actions()
        {
            $actions = parent::actions();
            unset($actions['index']);
    
            return $actions;
        }
    
        public function actionIndex()
        {
            $searchModel = new TaskSearch();
            $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    
            return $dataProvider;
        }
    }
    

    这里调用的TaskSearch类仿照了gii生成的ModelSearch类,TaskSearch类的代码

    <?php
    
    namespace appmodelsdb;
    
    use Yii;
    use yiiaseModel;
    use yiidataActiveDataProvider;
    use appmodelsdbTask;
    
    class TaskSearch extends Task
    {
        public $keyword;
    
        /**
         * @inheritdoc
         */
        public function rules()
        {
            return [
                [['projectId', 'keyword'], 'string'],
                ['main_type', 'in', 'range' => self::getEnumColumnValues('main_type')],
                ['type', 'in', 'range' => self::getEnumColumnValues('type')],
                ['_status', 'in', 'range' => self::getEnumColumnValues('_status')],
                ['publish_status', 'in', 'range' => self::getEnumColumnValues('publish_status')],
            ];
        }
    
        /**
         * @inheritdoc
         */
        public function scenarios()
        {
            // bypass scenarios() implementation in the parent class
            return Model::scenarios();
        }
    
        /**
         * Creates data provider instance with search query applied
         *
         * @param array $params
         *
         * @return ActiveDataProvider
         */
        public function search($params)
        {
            $this->load($params, '');
    
            if (!$this->validate()) {
                return (new yii
    estSerializer())->serialize($this);
            }
    
            $query = Task::find();
    
            $dataProvider = new ActiveDataProvider([
                'query' => $query,
                'pagination' => [
                    'defaultPageSize' => self::DEFAULT_PAGE_SIZE,
                    'pageSizeParam' => 'page_size',
                    'pageSizeLimit' => [0, 100],
                ],
            ]);
    
            $query->andFilterWhere([
                'projectId' => $this->projectId,
                'main_type' => $this->main_type,
                'type' => $this->type,
                '_status' => $this->_status,
                'publish_status' => $this->publish_status,
            ]);
            $query
                ->andFilterWhere(['like', 'name', $this->keyword]);
    
            return $dataProvider;
        }
    
    }
    

    这里面的

    $this->load($params, '');
    需要加上第二个参数,因为和activeform的表单提交不同,这里的输入只是一维数组而不是两维。

    'defaultPageSize' => self::DEFAULT_PAGE_SIZE
    默认的每页记录数(querystring内没有提供的情况下),如果没有这行,Yii2给的默认值是20


    'pageSizeParam' => 'page_size'
    每页记录数的querystring名称,默认是'per-page'。


    'pageSizeLimit' => [0, 100]
    如果page_size=0表示无分页限制,取出所有的纪录。这个值默认是[1, 50],防止page_size过大影响性能。


    if (!$this->validate()) {

        return (new yii estSerializer())->serialize($this);
    }
    这一段可以直接格式化输出错误内容,并且将Http status code改成4xx(表示客户端错误)。

    mongodb也有一个activerecord类:
    https://github.com/yiisoft/yii2-mongodb/blob/master/docs/guide/usage-ar.md

    使用的时候发现一些问题

    mongodb的objectId并不是纯数字,put/get one/delete方法会报404错误,所以yii的路由规则要加上一段,类似:

    ['class' => 'yii
    estUrlRule', 'controller' => ['rest/v2/tasklogs' => 'rest-v2/task-log'], 'tokens' => ['{id}' => '<id:\w[\w,]*>']],
    

     存日期类型的话要像下面一样

    $this->_created = new MongoDate(); // yii2-mongodb v2.0.x
    
    $this->_created = new MongodbBSONUTCDateTime(round(microtime(true))*1000); // yii2-mongodb v2.1.x

    输出显示的时候

    $this->_created = $this->_created->toDateTime()->setTimezone(new DateTimeZone('Asia/Shanghai'))->format("Y-m-d H:i:s");
    

    attributes和rules方法,attributes表示查询后输出显示的字段,rules里面控制的是输入验证的字段:

        /**
         * @inheritdoc
         */
        public function attributes()
        {
            return ['_id', 'message', 'data', '_created', '_updated'];
        }
    
        /**
         * @inheritdoc
         */
        public function rules()
        {
            return [
                [['message', 'data'], 'safe'],
            ];
        }
    

    page_size值等于0的时候,只返回一条记录,而不是所有,这里有个bug

    yii2-mongodb/Command.php下面(目前版本v2.1.2),603行

    if ($options['limit'] === null) {

    应该改成

    if ($options['limit'] === -1) {

  • 相关阅读:
    二叉树
    oracle 查看某session的历史执行sql情况
    mongodb备份与恢复
    MongoDB数据库基本用法
    常见Oracle HINT的用法
    提高Oracle的WHERE语句性能一些原则
    javascript的类、委托、事件
    Swift数据类型简介(二)
    arcgis api 3.x for js 入门开发系列十七在线天地图、百度地图、高德地图(附源码下载)
    arcgis api 4.x for js之图层管理篇
  • 原文地址:https://www.cnblogs.com/zergling9999/p/6090973.html
Copyright © 2020-2023  润新知