数据库与集合
概述
在本指南中,您可以了解如何使用Laravel MongoDB访问和管理MongoDB数据库和集合。
MongoDB以层次结构组织数据。MongoDB部署包含一个或多个数据库,每个数据库包含一个或多个集合。在每个集合中,MongoDB以包含字段和值对的文档形式存储数据。在Laravel集成中,您可以通过Eloquent模型访问文档。
有关文档数据格式的更多信息,请参阅文档在服务器手册中。
在连接配置中指定数据库
您可以在应用程序的config/database.php
文件中指定连接使用的数据库名称。该文件中的connections
属性存储了所有数据库连接信息,例如您的连接字符串、数据库名称以及可选的认证详情。指定数据库连接后,您可以进行数据库级操作并访问数据库包含的集合。
如果将database
属性设置为不存在数据库的名称,Laravel仍然会建立有效的连接。当您在数据库中的集合中插入任何数据时,服务器会自动创建它。
以下示例显示了如何在config/database.php
文件中设置默认数据库连接,并通过设置dsn
和database
属性来创建对animals
数据库的连接:
'default' => 'mongodb', 'connections' => [ 'mongodb' => [ 'driver' => 'mongodb', 'dsn' => 'mongodb://localhost:27017/', 'database' => 'animals', ], ... ]
当您设置默认数据库连接时,Laravel集成会使用该连接进行操作,但您可以在您的 config/database.php
文件中指定多个数据库连接。
以下示例展示了如何指定多个数据库连接(mongodb
和 mongodb_alt
)来访问 animals
和 plants
数据库。
'connections' => [ 'mongodb' => [ 'driver' => 'mongodb', 'dsn' => 'mongodb://localhost:27017/', 'database' => 'animals', ], 'mongodb_alt' => [ 'driver' => 'mongodb', 'dsn' => 'mongodb://localhost:27017/', 'database' => 'plants', ] ], ...
注意
当您使用相同的连接字符串创建两个客户端时,MongoDB PHP 驱动会重用相同的连接。使用两个连接访问不同的数据库没有开销,因此无需优化连接。
如果您的应用程序包含多个数据库连接,并且您想将模型存储在除默认数据库之外的其他数据库中,请覆盖您的 Model
类中的 $connection
属性。
以下示例展示了如何覆盖 Flower
模型类中的 $connection
属性以使用 mongodb_alt
连接。这会将Laravel集成指向存储在 plants
数据库的 flowers
集合中的模型,而不是默认数据库。
class Flower extends Model { protected $connection = 'mongodb_alt'; }
访问集合
当您创建扩展 MongoDB\Laravel\Eloquent\Model
的模型类时,Laravel集成会将模型数据存储在具有与您的模型类名称蛇形复数形式命名的集合中。
例如,如果您创建一个名为 Flower
的模型类,Laravel会将模型应用于数据库中的 flowers
集合。
提示
要了解如何在模型类中指定不同的集合名称,请参阅更改模型集合名称 部分的Eloquent模型类指南。
我们通常建议您使用Eloquent ORM来访问集合,以提高代码的可读性和可维护性。以下示例使用 Flower
类指定查找操作,因此Laravel从 flowers
集合检索结果。
Flower::where('name', 'Water Lily')->get()
注意
从Laravel集成v4.8版本开始,DB::collection()
方法已弃用。如下所示,您可以使用 DB::table()
方法访问MongoDB集合。
如果您无法通过Eloquent模型完成操作,可以通过调用DB
门面的table()
方法来访问查询构建器。以下示例显示了与上一个示例相同的查询,但查询是通过使用DB::table()
方法构建的。
DB::connection('mongodb') ->table('flowers') ->where('name', 'Water Lily') ->get()
列出集合
您可以通过以下任一操作来查看数据库中集合的信息:
运行Shell命令
您可以通过在项目的根目录中运行以下命令来列出数据库中的集合:
php artisan db:show
该命令输出配置数据库的信息,并在 表
标题下列出其集合。有关 db:show
命令的更多信息,请参阅官方 Laravel 博客上的 Laravel: 新的 DB 命令。
调用数据库或模式方法
您可以通过在应用程序中调用以下方法来列出数据库中的集合
DB::listCollections()
:使用查询构建器列出每个集合的信息Schema::getTablesListing()
:使用模式构建器列出每个集合的名称Schema::getTables()
:使用模式构建器列出每个集合的名称和大小
注意
MongoDB 是一个无模式的数据库,因此前面的模式构建器方法查询数据库数据而不是模式。
示例
以下示例访问数据库连接,然后调用 listCollections()
查询构建器方法以检索数据库中集合的信息
$collections = DB::connection('mongodb')->getMongoDB()->listCollections();
集合字段列表
您可以通过以下任一操作查看集合中每个字段的详细信息
运行Shell命令
您可以在项目根目录的Shell中运行以下命令来查看集合中的字段列表
php artisan db:table <collection name>
此命令在列
标题下输出每个集合字段及其对应的数据类型。有关db:table
命令的更多信息,请参阅官方Laravel博客上的Laravel: New DB Commands。
调用模式方法
您可以通过在您的应用程序中调用Schema::getColumns()
模式构建器方法来列出集合中的字段。
您还可以使用以下方法来获取关于集合字段的更多信息
Schema::hasColumn(string $<collection>, string $<field name>)
:检查指定的字段是否至少在一个文档中存在Schema::hasColumns(string $<collection>, string[] $<field names>)
:检查每个指定的字段是否至少在一个文档中存在
MongoDB是一个无模式的数据库,因此上述方法查询的是集合数据,而不是数据库模式。如果指定的集合不存在或为空,这些方法返回false
。
注意
id别名
从Laravel MongoDB v5.1开始,getColumns()
方法将MongoDB集合中的_id
字段名表示为返回的字段名列表中的别名id
。您可以在hasColumn()
和hasColumns()
方法中传递_id
或id
。
示例
以下示例将集合名称传递给Schema::getColumns()
方法以检索flowers
集合中的每个字段
$fields = Schema::getColumns('flowers');
创建和删除集合
要了解如何创建和删除集合,请参阅Schema Builder指南中的执行Laravel迁移部分。