Overview
在此页面上,您可以学习;了解如何将 Laravel MongoDB升级到新的主要版本。 此页面还包括您必须对应用程序进行的更改,以升级Laravel 集成版本而不丢失功能(如果适用)。
如何升级
升级前,请执行以下操作:
确保新的库版本与应用程序连接到的MongoDB Server版本以及应用程序运行所在的Laravel版本兼容。有关此信息,请参阅兼容性页面。
在本指南的“重大更改”部分中,解决应用程序现在使用的Laravel集成版本与计划升级版本之间的任何重大更改。
要升级库版本,请在应用程序目录中运行以下命令:
composer require mongodb/laravel-mongodb:5.8
要升级到该库的其他版本,请将laravel-mongodb:后面的信息替换为您的首选版本号。
重大更改
破坏性变更 (breaking change)是对特定版本的 Laravel 集成中的约定或行为的修改,可能会阻止您的应用程序按预期工作。
本节中的重大更改按引入它们的主要版本进行分类。 升级库版本时,请解决当前版本和计划升级版本之间的所有重大更改。
5.x 版重大更改
此库版本引入了以下重大更改:
查询构建器将结果作为
stdClass对象而不是数组返回。此更改要求您在与查询结果交互时将大量访问权限更改为属性访问权限。以下代码展示了如何在旧版本(与 v 5.0相比)中检索查询结果并从结果对象访问权限属性:
$document = DB::table('accounts') ->where('name', 'Anita Charles') ->first(); // older versions $document['balance']; // v5.0 $document->balance; 删除对以下类的支持:
MongoDB\Laravel\Auth\DatabaseTokenRepository。相反,请使用默认的Illuminate\Queue\Failed\DatabaseFailedJobProvider类并指定与MongoDB的连接。MongoDB\Laravel\Queue\Failed\MongoFailedJobProvider。相反,请使用默认的Illuminate\Queue\Failed\DatabaseFailedJobProvider类并指定与MongoDB的连接。
在查询中使用
DateTimeInterface对象(包括Carbon)时,该库会将DateTimeInterface转换为MongoDB\BSON\UTCDateTime对象。 此转换适用于作为查询筛选器传递给where()方法的DateTimeInterface对象,或作为数据传递给insert()和update()方法的 对象。要查看将
Carbon对象传递给DB::where()方法的示例,请参阅 查询生成器指南的匹配日期示例部分。在查询结果中,该库将BSON
UTCDateTime对象转换为Carbon日期类,并应用默认时区。在 v 5.1 中,在水合模型实例之前,该库还会对
Model::raw()方法结果执行此转换。删除支持
$collection属性的支持。 以下代码展示了如何在旧版本(与 v 5.0相比)中将MongoDB集合分配给User类中的变量:use MongoDB\Laravel\Eloquent\Model; class User extends Model { protected $keyType = 'string'; // older versions protected $collection = 'app_user'; // v5.0 protected $table = 'app_user'; ... } 此发布还修改了用于访问MongoDB集合的相关
DB和Schema方法。 以下代码展示了如何在旧版本与 v 5.0中访问权限app_user集合:use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\DB; use MongoDB\Laravel\Schema\Blueprint; // older versions Schema::collection('app_user', function (Blueprint $collection) { ... }); DB::collection('app_user')->find($id); // v5.0 Schema::table('app_user', function (Blueprint $table) { ... }); DB::table('app_user')->find($id);
版本 4.x 重大更改
此库版本引入了以下重大更改:
最低 Laravel 版本现在为 10.0。有关升级 Laravel 版本的说明,请参阅 Laravel 文档中的升级指南。
依赖名称现在为
"mongodb/laravel-mongodb"。 确保composer.json文件中的依赖项名称为"mongodb/laravel-mongodb": "^4.0"。 然后运行composer update。命名空间现在为
MongoDB\Laravel\。 确保在模型和配置文件中将命名空间从Jenssegers\Mongodb\更改为MongoDB\Laravel\。删除了对非 Laravel 项目的支持。
删除对
$dates属性的支持。 确保将模型文件中$dates的所有实例更改为$casts。Model::unset($field)不会持久化更改。 确保对Model::unset($field)的所有调用都使用Model::save()进行跟踪。删除
Query\Builder::whereAll($column, $values)方法。 确保将对Query\Builder::whereAll($column, $values)的所有调用替换为Query\Builder::where($column, 'all', $values)。Query\Builder::delete()可删除一个或所有文档。 确保仅将值1或null传递给limit()。whereDate()whereDay()、whereMonth()、whereYear()和whereTime()方法现在在日期字段上使用 MongoDB 操作符。添加
MongoDB\Laravel\Eloquent\MassPrunable特征。 确保将模型中Illuminate\Database\Eloquent\MassPrunable的所有实例替换为MongoDB\Laravel\Eloquent\MassPrunable。删除对以下
Query\Builder方法的支持:toSql()toRawSql()whereColumn()whereFullText()groupByRaw()orderByRaw()unionAll()union()having()havingRaw()havingBetween()whereIntegerInRaw()orWhereIntegerInRaw()whereIntegerNotInRaw()orWhereIntegerNotInRaw()
弃用
弃用通知表示计划在未来的主要版本中删除某项功能。在升级到下一个主要版本之前,解决应用程序中的弃用通知。
版本 5.8弃用
从 Laravel MongoDB v5.8 开始,Eloquent 模型属性的 array 转换类型已弃用。使用 array 作为转换类型将属性值存储为MongoDB中的JSON编码字符串,这不是原生BSON格式。当您写入使用 array 转换的属性时,该库会发出以下弃用通知:
USER DEPRECATED The "array" cast on attribute "<attribute>" of model "<Model>" stores values as a JSON-encoded string in MongoDB, which is not the native format. Remove the cast to store native BSON arrays. If you must keep JSON string storage, use the "json" cast explicitly.
弃用通知包括受影响的属性和模型类的名称。
要为未来版本迁移模型属性,请使用以下选项之一:
删除
array转换(推荐)。如果没有转换类型, MongoDB本身会将PHP数组作为BSON数组进行存储和检索。以下代码展示了如何更新模型:// Before (deprecated in v5.8) protected $casts = [ 'options' => 'array', ]; // After: remove the cast to use native BSON storage protected $casts = [ // other casts... ]; 将
array替换为json以显式保留JSON字符串存储:protected $casts = [ 'options' => 'json', ];
如果字段已包含原生BSON大量,并且模型仍使用 array 转换,则库可正确读回该字段。
重要
在删除字段中的 array 转换之前,请将该字段中任何现有的JSON编码字符串值迁移到原生BSON数组。该库不会自动迁移现有数据。