在 Yii 2 中基于 yii\db\ActiveQuery::joinWith() 关联声明查询数据,响应字段类型为字符串的分析解决

1、在 \qq\rests\article_category\StandardIndexAction.php 中

 /* @var $modelClass \yii\db\BaseActiveRecord */ $modelClass = $this->modelClass;

 $query = $modelClass::find()
  ->joinWith('qqArticleCategoryNormal')
  ->where([
   $modelClass::tableName() . '.is_deleted' => $modelClass::IS_DELETED_NO,
   QqArticleCategoryNormal::tableName() . '.is_deleted' => QqArticleCategoryNormal::IS_DELETED_NO,
  ])
  ->asArray()
  ->orderBy([$modelClass::tableName() . '.id' => SORT_DESC]);
 if (!empty($filter)) {
  $query->andFilterWhere($filter);
 }

 // 设置每页资源数量默认为资源总数
 $count = (int) $query->count($modelClass::tableName() . '.id');
 if (empty($requestParams['per-page'])) {
  $requestParams['per-page'] = $count;
 }

 return Yii::createObject([
  'class' => ActiveDataProvider::className(),
  'query' => $query,
  'pagination' => [
   'params' => $requestParams,
   'pageSizeLimit' => [1, $count],
  ],
  'sort' => [
   'params' => $requestParams,
  ],
 ]);

2、期待的响应结果如下:

 "items": [
  {
   "id": 226,
   "name": "其他综艺",
   "parent_id": 0,
   "status": 1,
   "is_deleted": 0,
   "created_at": 1542178227,
   "updated_at": 1542178227,
   "deleted_at": 0
  },
  {
   "id": 225,
   "name": "舞台剧",
   "parent_id": 0,
   "status": 1,
   "is_deleted": 0,
   "created_at": 1542178227,
   "updated_at": 1542178227,
   "deleted_at": 0
  }
 ]

3、实际的响应结果如下:所有字段类型皆为字符串,如图1

图1

 "items": [
  {
   "id": "67",
   "name": "跑步",
   "parent_id": "0",
   "status": "1",
   "is_deleted": "0",
   "created_at": "1542178227",
   "updated_at": "1542178227",
   "deleted_at": "0"
  },
  {
   "id": "66",
   "name": "健身",
   "parent_id": "0",
   "status": "1",
   "is_deleted": "0",
   "created_at": "1542178227",
   "updated_at": "1542178227",
   "deleted_at": "0"
  }
 ]

4、编辑 \qq\rests\article_category\Serializer.php,打印 $models

class Serializer extends \yii\rest\Serializer
{
    /**
     * Serializes a data provider.
     * @param DataProviderInterface $dataProvider
     * @return array the array representation of the data provider.
     */    protected function serializeDataProvider($dataProvider)
    {
        if ($this->preserveKeys) {
            $models = $dataProvider->getModels();
        } else {
            $models = array_values($dataProvider->getModels());
        }
        $models = $this->serializeModels($models);

        var_dump($models);
        exit;
 }
}

5、打印结果如下,所有字段皆为字符串

array(67) {
  [0]=>
  array(9) {
    ["id"]=>
    string(2) "67"
    ["name"]=>
    string(6) "跑步"
    ["parent_id"]=>
    string(1) "0"
    ["status"]=>
    string(1) "1"
    ["is_deleted"]=>
    string(1) "0"
    ["created_at"]=>
    string(10) "1542178227"
    ["updated_at"]=>
    string(10) "1542178227"
    ["deleted_at"]=>
    string(1) "0"
    ["qqArticleCategoryNormal"]=>
    array(8) {
      ["id"]=>
      string(3) "334"
      ["article_category_id"]=>
      string(2) "67"
      ["name"]=>
      string(6) "跑步"
      ["status"]=>
      string(1) "1"
      ["is_deleted"]=>
      string(1) "0"
      ["created_at"]=>
      string(10) "1542178227"
      ["updated_at"]=>
      string(10) "1542178227"
      ["deleted_at"]=>
      string(1) "0"
    }
  }
}

6、编辑 \qq\rests\article_category\StandardIndexAction.php,删除 ->asArray(),因为仅需要当前模型的数据,不需要关联模型的数据(即 qqArticleCategoryNormal)

        /* @var $modelClass \yii\db\BaseActiveRecord */        $modelClass = $this->modelClass;

        $query = $modelClass::find()
            ->joinWith('qqArticleCategoryNormal')
            ->where([
                $modelClass::tableName() . '.is_deleted' => $modelClass::IS_DELETED_NO,
                QqArticleCategoryNormal::tableName() . '.is_deleted' => QqArticleCategoryNormal::IS_DELETED_NO,
            ])
            ->orderBy([$modelClass::tableName() . '.id' => SORT_DESC]);
        if (!empty($filter)) {
            $query->andFilterWhere($filter);
        }

        // 设置每页资源数量默认为资源总数
        $count = (int) $query->count($modelClass::tableName() . '.id');
        if (empty($requestParams['per-page'])) {
            $requestParams['per-page'] = $count;
        }

        return Yii::createObject([
            'class' => ActiveDataProvider::className(),
            'query' => $query,
            'pagination' => [
                'params' => $requestParams,
                'pageSizeLimit' => [1, $count],
            ],
            'sort' => [
                'params' => $requestParams,
            ],
        ]);

7、实际的响应结果如下:字段类型与数据库中一致,符合预期,如图2

图2

 "items": [
  {
   "id": 67,
   "name": "跑步",
   "parent_id": 0,
   "status": 1,
   "is_deleted": 0,
   "created_at": 1542178227,
   "updated_at": 1542178227,
   "deleted_at": 0
  },
  {
   "id": 66,
   "name": "健身",
   "parent_id": 0,
   "status": 1,
   "is_deleted": 0,
   "created_at": 1542178227,
   "updated_at": 1542178227,
   "deleted_at": 0
  }
 ]
永夜