2015-11-27 85 views
1

我正在尝试使用yii2的REST api获取json格式中所有项目的列表。基本上,它返回一个没有排序的20个项目的列表。但我需要某种东西。如果我不得不告诉他们,我可能会重新定义控制器的动作指数这样的方式:yii2 rest api tuning

public function actionIndex() 
{ 
    $modelClass = $this->modelClass; 
    $dictionaries = $modelClass::find()->select([ 
      '{{site_search_dictionary}}.*', // select all customer fields 
      'COUNT(*) AS dd' // calculate orders count 
     ]) 
     ->joinWith('queries') // ensure table junction 
     ->groupBy('dictionary_id') // group the result to ensure aggregation function works 
      ->orderBy('dictionary')->all(); 

    return $this->render('index', [ 
     'dictionaries' => $dictionaries, 
    ]); 
} 

但我能做些什么来改变同样的方式回应休息查询?

回答

0

我想你可以用它舔这个

public function actionIndex() 
{ 
$modelClass = $this->modelClass; 
$dictionaries = $modelClass::find()->select([ 
     '{{site_search_dictionary}}.*', // select all customer fields 
     'COUNT(*) AS dd' // calculate orders count 
    ]) 
    ->joinWith('queries') // ensure table junction 
    ->groupBy('dictionary_id') // group the result to ensure aggregation function works 
     ->orderBy(['dictionary_id'=>SORT_ASC])->all(); 

return $this->render('index', [ 
    'dictionaries' => $dictionaries, 
]); 
} 
+0

不,它没有任何结果。我认为可能重新定义prepareDataProvider可以提供帮助,但我不知道在这种情况下我应该返回什么。 –

+0

重新定义prepareDataprovider是什么意思?数据提供者在哪里? –

1

你可以重新定义prepareDataProvider索引操作。

public function actions() 
     { 
      $actions = parent::actions(); 
      $actions['index']['prepareDataProvider'] = [$this, 'prepareDataProvider']; 

      return $actions; 
     } 

这将从您的控制器调用prepareDataProvider方法而不是内置方法。

例如:

public function prepareDataProvider() 
     { 
      $searchModel = new SiteDictionarySearch(); 
      $dataProvider = $searchModel->search(\Yii::$app->request->queryParams); 
      return $dataProvider; 
     } 

你应该让你的模型,这样的需求的搜索模式。要返回所有项目更好地利用ArrayDataProviderfind()->asArray()

这里是回报应该什么样子:

return new ArrayDataProvider([ 
       'allModels' => $rows, 
       'pagination' => [ 
        'pageSize' => count($rows), 
       ], 
      ]); 
+0

是的,但是为什么我需要使用ArrayDataProvider,如果我想将结果格式化为json? –

+0

您可以改为返回activeDataProvider,但会遇到分页限制问题。在休息时查看IndexAction的源代码。 – ineersa

+0

好吧,好,现在它工作正常,但似乎find() - > asArray()在这里没有必要 - 导致find-> select ...的结果已经是一个数组。 –