飘逸

飘逸

这家伙有点懒,还没写个性签名!

  • 财富值4408
  • 威望值280
  • 总积分8178

个人信息

  • dataProvider,顾名思义,数据提供者。

    但是这个提供者还需要一个数据源。那个数据源在你这里便是$query了,但是$query仅仅只是个数据源。提供者或许还会对这个数据源进行一些处理比如默认排序,当然你的排序也可以在$query里声明,所以你最终的数据是$dataProvider提供的,而不是$query。这点切记。

    对于数据提供者你可以在权威指南的 显示数据-》数据提供器 章节中得到详细的描述。

    而你的需求是,在$dataProvider传入到view渲染整个view之前获取其最终结果。

    以GII用yii\data\ActiveDataProvider生成的$dataProvider为例:

    在视图中你可以看到如下的代码

        use app\models\Model;
    
        public function actionIndex()
        {
            $searchModel = new Model();
            $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    
            return $this->render('index', [
                'searchModel' => $searchModel,
                'dataProvider' => $dataProvider,
            ]);
        }
    

    $dataProvider是代表着最终数据的未经处理的数据源了,如果你想要提前获取其结果。
    你可以在$dataProvider = 之后:

    $model = $dataProvider->getModels();  //getModels()是数据提供者的一个获取最终执行结果的方法。对于不同的提供器返回不同的类型的值。
    

    这里的$model代表着对$query分完页排完序之后的$dataProvider的最终执行结果。
    它是Model实例的数组。你在处理的时候可以以foreach循环外层数组,以obj->attribute输出其属性。

    所以最终的代码看起来是酱紫的:

        use app\models\Model;
        public function actionIndex()
        {
            $searchModel = new Model();
            $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    		
            $model = $dataProvider->getModels();
    
    	foreach ($model as $v) {
    		echo $v->id . '<br>';
                    //.......
    	}
            //......
            die;
    
            return $this->render('index', [
                'searchModel' => $searchModel,
                'dataProvider' => $dataProvider,
            ]);
        }
    

    再次强调下一个非常关键的一点:
    对于数据提供者你可以在权威指南的 显示数据-》数据提供器 章节中得到详细的描述。

  • 2016-07-28 已签到
    连续签到2天,获得了10个金钱
  • 关注了
  • 回复了 的说说
    Hello Yii
    裤衩侠再出江湖,必将掀起YII界的又一场腥风血雨啊。
  • 2016-07-27 已签到
    连续签到1天,获得了5个金钱
  • 当你第一次访问该页面时,你的title条件是从某处post过来的,此时存在post的title。而当你点击下一页的时候,并没有进行你预想的post 一个 title 的请求,甚至你的title的条件都无法保留,毕竟分页物件是基于get去请求的。而在你title的条件没保留的情况下你使用了Yii::$app->request->post()去接受这个并不存在的变量也不会报错。因为request组件的post()会判断是否当前存在这个变量。如果不存在便会返回null。试想一下。当你查询出的数据的title字段的值是null的时候去以数组格式输出这个title下标。便出现了undefined index title。

    你需要做的是,把你的post 一个title改成 get title。而这次的title条件会在分页物件的一次次的分页get请求中保留下来。

    祝你好运。

  • asArray()对空表会返回个空的数组。不会报错的。

    楼主试试:(你需要把Table换成实际的model)

    $ary = Table::find()->asArray()->all();
    
    print_r($ary);
    
  • 2016-07-25 已签到
    连续签到2天,获得了10个金钱
  • 2016-07-24 已签到
    连续签到1天,获得了5个金钱
  • 回复了 的回答

    你可以为其配置 content 属性,属性的值是一个匿名函数。他看起来就像是这样子的

    'columns' => [
        'id',
        'title',
        [
            'attribute' => 'created_at',
            'content' => function ($model, $key, $index, $column) {
                return '你需要的字符串,在这里的$model很有用比如:' . $model->created_at;
             }
        ],
    ],
    

    哦哦,不过当你需要的字符串更复杂一些比如你的这个提问。这种方法还是不错的。

副总裁 等级规则
8178/10000
资料完整度
10/100
用户活跃度
0/100

Ta的关注

15

Ta的粉丝

22

Ta的访客

68