没有不值得去解决的问题,也没有不值得去学习的技术!

在 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
		}
	]


PHP / Laravel / Yii2 老项目维护与长期技术支持

如果你的 PHP / Laravel / Yii2 项目已经上线,但遇到原开发离职、Bug 长期无人修复、接口不稳定、性能下降、代码难以接手等问题,可以联系我做一次远程技术排查。

适合以下情况:
✅ 老旧 PHP 系统无人维护
✅ Laravel / Yii2 项目 Bug 修复
✅ 后台管理系统小功能迭代
✅ RESTful API 接口排查
✅ MySQL / Redis / Nginx 性能问题
✅ 长期远程兼职维护

可先从一次小问题开始:
✅ 线上报错排查
✅ 接口异常分析
✅ 慢查询与性能瓶颈定位
✅ 代码结构初步评估
✅ 部署环境与日志检查

如需咨询,请联系我,并注明:PHP 维护咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理