Overview
在本指南中,您可以学习;了解如何使用 Laravel MongoDB从 Laravel应用程序将文档插入MongoDB集合。
插入文档时,请确保数据不违反集合上的任何唯一索引。 插入集合的第一个文档或创建新集合时,MongoDB 会自动在_id字段上创建唯一索引。
有关使用 Laravel 模式构建器在 MongoDB 集合上创建索引的更多信息,请参阅模式构建器文档的管理索引部分。
要学习;了解有关 Laravel 集成中的 Eloquent 模型的更多信息,请参阅对数据进行建模部分。
示例模型
本指南中的操作引用了以下 Eloquent 模型类:
namespace App\Models; use MongoDB\Laravel\Eloquent\Model; class Concert extends Model { protected $connection = 'mongodb'; protected $fillable = ['performer', 'venue', 'genres', 'ticketsSold', 'performanceDate']; protected $casts = ['performanceDate' => 'datetime']; }
提示
$fillable属性允许您对插入操作使用 Laravel 批量分配。 要学习;了解有关批量分配的更多信息,请参阅 Eloquent 模型类文档中的自定义批量分配。
$casts 属性指示 Laravel 将属性转换为常见数据类型。要学习;了解更多信息,请参阅 Laravel 文档中的属性转换。
插入一个文档
本节中的示例展示了如何使用 save() 和 create() Eloquent 方法将 Concert 模型的实例作为MongoDB文档插入。
save() 方法
当save()方法成功时,您可以访问权限调用该方法的模型实例。
如果操作失败,则会为模型实例分配null 。
此示例代码执行以下操作:
创建
Concert模型的新实例为
performer和venue字段分配string值将字符串数组赋值给
genre字段为
ticketsSold字段分配一个数字使用
Carbon包为performanceDate字段分配日期通过调用
save()方法插入文档
$concert = new Concert(); $concert->performer = 'Mitsuko Uchida'; $concert->venue = 'Carnegie Hall'; $concert->genres = ['classical']; $concert->ticketsSold = 2121; $concert->performanceDate = Carbon::create(2024, 4, 1, 20, 0, 0, 'EST'); $concert->save();
您可以通过访问模型的id成员来检索插入文档的_id值,如以下代码示例所示:
$insertedId = $concert->id;
create() 方法
如果通过定义$fillable或$guarded属性来启用批量分配,则可以使用 Eloquent 模型的create()方法在单次调用中执行插入,如以下示例所示:
$insertResult = Concert::create([ 'performer' => 'The Rolling Stones', 'venue' => 'Soldier Field', 'genres' => [ 'rock', 'pop', 'blues' ], 'ticketsSold' => 59527, 'performanceDate' => Carbon::create(2024, 6, 30, 20, 0, 0, 'CDT'), ]);
插入多个文档
此示例演示如何使用insert() Eloquent 方法将Concert模型的多个实例作为MongoDB文档插入。 这种批量插入方法减少了应用程序为保存文档所需进行的调用次数。
当 insert() 方法成功时,将返回值 true。如果失败,则会引发异常。
以下示例通过将多个模型作为大量传递给 insert() 方法,在一次调用中保存多个模型:
$data = [ [ 'performer' => 'Brad Mehldau', 'venue' => 'Philharmonie de Paris', 'genres' => [ 'jazz', 'post-bop' ], 'ticketsSold' => 5745, 'performanceDate' => new UTCDateTime(Carbon::create(2025, 2, 12, 20, 0, 0, 'CET')), ], [ 'performer' => 'Billy Joel', 'venue' => 'Madison Square Garden', 'genres' => [ 'rock', 'soft rock', 'pop rock' ], 'ticketsSold' => 12852, 'performanceDate' => new UTCDateTime(Carbon::create(2025, 2, 12, 20, 0, 0, 'CET')), ], ]; Concert::insert($data);
注意
此示例将日期包装在MongoDB\BSON\UTCDateTime类中,以将其转换为MongoDB可以序列化的类型,因为 Laravel 在批量插入操作上跳过属性转换。
完全可运行的示例
以下部分提供了完全可运行的代码示例,演示了如何使用 Laravelsample_mflix.movies 集成插入文档。这些示例使用Atlas示例数据集中的 集合。
提示
插入文档
从以下 Eloquent 和 Query Builder 标签页中进行选择,以查看每个相应查询语法的示例:
此示例将执行以下动作:
使用
MovieEloquent 模型表示sample_mflix数据库中的movies集合将文档插入
movies集合打印新插入的文档
该示例调用 create() 方法插入包含以下字段和值的文档:
title的值"Marriage Story"year的值2019runtime的值136
$movie = Movie::create([ 'title' => 'Marriage Story', 'year' => 2019, 'runtime' => 136, ]); echo $movie->toJson();
{ "title": "Marriage Story", "year": 2019, "runtime": 136, "updated_at": "...", "created_at": "...", "_id": "..." }
此示例将执行以下动作:
通过从
DB门面调用table()方法来访问movies集合将文档插入
movies集合打印插入操作是否成功
该示例调用 insert() 方法插入包含以下字段和值的文档:
title的值"Marriage Story"year的值2019runtime的值136
$success = DB::table('movies') ->insert([ 'title' => 'Marriage Story', 'year' => 2019, 'runtime' => 136, ]); echo 'Insert operation success: ' . ($success ? 'yes' : 'no');
Insert operation success: yes
插入多个文档
从以下 Eloquent 和 Query Builder 标签页中进行选择,以查看每个相应查询语法的示例:
此示例将执行以下动作:
使用
MovieEloquent 模型表示sample_mflix数据库中的movies集合将文档插入
movies集合打印插入操作是否成功
该示例调用 insert() 方法插入代表 2023 上映电影的文档。
$success = Movie::insert([ [ 'title' => 'Anatomy of a Fall', 'release_date' => new UTCDateTime(new DateTimeImmutable('2023-08-23')), ], [ 'title' => 'The Boy and the Heron', 'release_date' => new UTCDateTime(new DateTimeImmutable('2023-12-08')), ], [ 'title' => 'Passages', 'release_date' => new UTCDateTime(new DateTimeImmutable('2023-06-28')), ], ]); echo 'Insert operation success: ' . ($success ? 'yes' : 'no');
Insert operation success: yes
此示例将执行以下动作:
通过从
DB门面调用table()方法来访问movies集合将文档插入
movies集合打印插入操作是否成功
该示例调用 insert() 方法插入代表 2023 上映电影的文档。
$success = DB::table('movies') ->insert([ [ 'title' => 'Anatomy of a Fall', 'release_date' => new UTCDateTime(new DateTimeImmutable('2023-08-23')), ], [ 'title' => 'The Boy and the Heron', 'release_date' => new UTCDateTime(new DateTimeImmutable('2023-12-08')), ], [ 'title' => 'Passages', 'release_date' => new UTCDateTime(new DateTimeImmutable('2023-06-28')), ], ]); echo 'Insert operation success: ' . ($success ? 'yes' : 'no');
Insert operation success: yes
更多信息
要学习;了解有关Carbon PHP API扩展的更多信息,请参阅Carbon Github存储库。