Yii2查询返回数组而非字符串,图片命名保存异常求助
解决Yii中获取自增ID拼接文件名时出现'Array'的问题
嘿,我完全懂你遇到的麻烦——你想把下一个自增ID包含到图片文件名里,但拼接出来的结果居然是article_Array_1516534305.png,而不是预期的带数字ID的文件名。咱们来拆解问题,一步步搞定它:
问题根源
你用$query->one()获取自增ID时,这个方法返回的是关联数组,格式大概是这样的:
['AUTO_INCREMENT' => 13]
当你直接把这个数组和字符串拼接时,PHP会自动把数组转换成字符串'Array',这就是你看到异常文件名的原因。
快速解决方案
方案1:直接提取数组中的键值
既然one()返回的是关联数组,咱们直接取出AUTO_INCREMENT对应的值就行:
$connection = Yii::$app->getDb(); $dbName = $this->getDsnAttribute('dbname', Yii::$app->getDb()->dsn); $query = new Query; $query->select('AUTO_INCREMENT') ->from('information_schema.TABLES') ->where("TABLE_SCHEMA = '" . $dbName . "'") ->andWhere("TABLE_NAME = '" . $this->tableName() . "'"); // 直接获取数组中的AUTO_INCREMENT字段值 $id = $query->one()['AUTO_INCREMENT']; $this->image = 'article_' . $id . '_' . time() . '.' . $image->extension;
方案2:使用scalar()方法更简洁
Yii的Query类提供了scalar()方法,专门用来获取单个字段的纯值,不用再处理数组:
$connection = Yii::$app->getDb(); $dbName = $this->getDsnAttribute('dbname', Yii::$app->getDb()->dsn); $query = new Query; $query->select('AUTO_INCREMENT') ->from('information_schema.TABLES') ->where("TABLE_SCHEMA = '" . $dbName . "'") ->andWhere("TABLE_NAME = '" . $this->tableName() . "'"); // scalar()直接返回单个字段的数值 $id = $query->scalar(); $this->image = 'article_' . $id . '_' . time() . '.' . $image->extension;
关于array_shift()无效的说明
你提到用了array_shift()也没效果,大概率是没把处理后的结果赋值给$id。如果写成$id = array_shift($query->one());其实是可以拿到正确ID的,但对比上面两种方案,显然直接取键值或用scalar()更直观易懂。
额外建议:避免并发场景的ID不匹配问题
用information_schema获取自增ID有个潜在风险:如果在你获取ID到保存模型的这段时间里,有其他用户插入了新数据,那你拿到的ID会被占用,导致文件名里的ID和实际数据库行ID不一致。
如果要求文件名必须和最终行ID完全一致,更稳妥的做法是先保存模型拿到真实ID,再更新图片名称:
// 先保存模型(跳过验证可选,根据你的业务需求调整) $this->save(false); // 此时$this->id就是数据库中实际的行ID $this->image = 'article_' . $this->id . '_' . time() . '.' . $image->extension; // 只更新image字段 $this->save(false, ['image']);
内容的提问来源于stack exchange,提问作者Yury
相关产品推荐
相关产品推荐

