yii 提供了兩種數據提供器 ActiveDataProvider和SqlDataProvider
使用方法也是非常簡單 具體可查詢官方文檔
$model = new ActiveDataProvider(['query'=>$query]);
$result = new SqlDataProvider(['sql'=>$sql ]);
效果如下
如果當前數據模式滿足不了我們的業務需求怎麼增加返回字段
- 接口拆分寫兩個接口
- 更改Yii代碼進行多字段返回(如我們統一返回info字段)
首先建立base層(繼承)
// ActiveDataProvider.php
class ActiveDataProvider extends \yii\data\ActiveDataProvider
{
public $info;
}
//SqlDataProvider.php
class SqlDataProvider extends \yii\data\SqlDataProvider
{
public $info;
}
//MySerializer.php 改文件可在base控制器中使用
//public $serializer = [
// 'class' => '\base\MySerializer',
// 'collectionEnvelope' => 'data',
// ];
//也可在需要返回改格式的控制器中使用
<?php
namespace backend\modules\v2\base;
class MySerializer extends \yii\rest\Serializer
{
/**
* 應app端要求,重寫serializeDataProvider方法,加上code=1
* @param \yii\data\DataProviderInterface $dataProvider
* @return array|null
*/
protected function serializeDataProvider($dataProvider)
{
if ($this->preserveKeys) {
$models = $dataProvider->getModels();
} else {
$models = array_values($dataProvider->getModels());
}
$models = $this->serializeModels($models);
if (($pagination = $dataProvider->getPagination()) !== false) {
$this->addPaginationHeaders($pagination);
}
if ($this->request->getIsHead()) {
return null;
} elseif ($this->collectionEnvelope === null) {
return $models;
}
$result = [
'code' => 1,
$this->collectionEnvelope => $models,
];
if(isset($dataProvider->info)) $result['info'] = $dataProvider->info;//自定義增加返回條件
if ($pagination !== false) {
return array_merge($result, $this->serializePagination($pagination));
}
return $result;
}
}
然後效果數據如下