Laravel MongoDB保存数据时如何维持原有数据类型?
解决缓存中保留原数据类型的方案
针对缓存时std对象被转为关联数组、读取后类型不匹配的问题,以下是几种适配不固定数据结构的可行解决方法:
1. 使用PHP原生序列化(serialize/unserialize)
PHP的serialize()函数可以完整保留数据的原始类型(包括stdClass对象、关联数组、索引数组等),读取时通过unserialize()还原。
保存示例:
$rawData = [ 'type' => 'pr', 'stage' => 'fetching', 'data' => [ 'name' => 'pr_name', 'history' => [ 0 => (object)[ "price" => 10.00, "datetime" => "2023-10-22 01:32:00" ] ] ] ]; // 序列化后保存 $serializedContent = serialize($rawData); CachedData::create(['content' => $serializedContent]);
读取示例:
$cacheRecord = CachedData::where('type', 'pr')->first(); if ($cacheRecord) { $originalData = unserialize($cacheRecord->content); // 此时$originalData['data']['history'][0]仍是stdClass对象 }
注意:确保缓存数据来源可信,避免使用unserialize()处理不可信数据,防止代码注入风险。
2. 使用igbinary高效序列化
如果缓存数据量较大,推荐使用igbinary扩展,它比原生序列化速度更快、体积更小,同样能保留完整类型。
步骤:
- 安装igbinary扩展(通过PECL或源码编译)
- 保存与读取示例:
// 保存 $serializedContent = igbinary_serialize($rawData); CachedData::create(['content' => $serializedContent]); // 读取 $originalData = igbinary_unserialize($cacheRecord->content);
3. 调整模型的字段处理逻辑
如果CachedData是Eloquent模型,检查是否设置了$casts属性将字段转为数组。若有,移除该配置,改为手动处理序列化:
class CachedData extends Model { protected $fillable = ['content']; // 移除类似 'content' => 'array' 的casts配置 }
这样模型不会自动将字段转为JSON数组,而是直接存储序列化后的字符串,读取后反序列化即可还原原类型。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

