数据库和集合
Overview
在本指南中,您可以了解如何使用 Laravel MongoDB 访问和管理 MongoDB 数据库和集合。
MongoDB以分层结构组织数据。 MongoDB 部署包含一个或多个数据库,每个数据库又包含一个或多个集合。 在每个集合中, MongoDB将数据存储为包含字段和值对的文档。 在 Laravel 集成中,您可以通过 Eloquent 模型访问权限文档。
在连接配置中指定数据库
您可以在应用程序的 config/database.php
文件中指定连接使用的数据库名称。 此文件中的 connections
属性存储所有数据库连接信息,例如连接string 、数据库名称以及可选的身份验证详细信息。 指定数据库连接后,您可以执行数据库级操作并访问数据库包含的集合。
如果您设立database
属性中的数据库名称设置为不存在的数据库的名称,Laravel 仍会建立有效连接。 将任何数据插入数据库中的集合时,服务器都会自动创建该数据。
以下示例展示了如何设立默认数据库连接,并通过设置dsn
和database
属性在config/database.php
文件中创建与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', ] ], ...
注意
MongoDBPHP当您使用相同的连接 创建两个客户端时,string 驾驶员会重复使用相同的连接。对两个不同的数据库使用两个连接没有开销,因此没有必要优化连接。
如果您的应用程序包含多个数据库连接,并且您希望将模型存储在默认数据库以外的数据库中,请覆盖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 Integration v 4.8开始, DB::collection()
方法已弃用。 如以下示例所示,您可以使用DB::table()
方法访问权限MongoDB集合。
如果使用 Eloquent 模型无法完成操作,则可以通过调用DB
门面上的table()
方法来访问查询构建器。 以下示例显示了与上一示例相同的查询,但该查询是使用DB::table()
方法构造的:
DB::connection('mongodb') ->table('flowers') ->where('name', 'Water Lily') ->get()
listCollections
您可以执行以下任一操作来查看有关数据库中集合的信息:
运行shell命令
您可以在项目根目录下的shell中运行以下命令,从而列出数据库中的集合:
php artisan db:show
此命令输出有关已配置数据库的信息,并在 Table
标头下列出其集合。有关db:show
命令的更多信息,请参阅 Laravel 官方博客上的新数据库命令 。
调用数据库或模式方法
您可以通过在应用程序中调用以下方法来列出数据库中的集合:
DB::listCollections()
:使用查询构建器列出有关每个集合的信息Schema::getTablesListing()
:使用模式构建器列出每个集合的名称Schema::getTables()
:使用模式构建器列出每个集合的名称和大小
注意
MongoDB是无模式数据库,因此前面的模式构建器方法会查询数据库数据而不是模式。
例子
以下示例访问数据库连接,然后调用listCollections()
查询构建器方法来检索有关数据库中集合的信息:
$collections = DB::connection('mongodb')->getMongoDB()->listCollections();
列出集合字段
您可以执行以下任一操作来查看有关集合中每个字段的信息:
运行shell命令
您可以通过在shell中项目根目录运行以下命令来查看集合中的字段列表:
php artisan db:table <collection name>
此命令输出Column
标头下的每个集合字段及其相应的数据类型。 有关db:table
命令的更多信息,请参阅 Laravel:新的数据库命令 在 Laravel 官方博客。
调用模式方法
您可以通过调用应用程序中的Schema::getColumns()
模式构建器方法来列出集合中的字段。
您还可以使用以下方法返回有关集合字段的更多信息:
Schema::hasColumn(string $<collection>, string $<field name>)
:检查指定字段是否存在于至少一个文档中Schema::hasColumns(string $<collection>, string[] $<field names>)
:检查每个指定字段是否存在于至少一个文档中
MongoDB是无模式数据库,因此上述方法查询的是集合数据,而不是数据库模式。 如果指定的集合不存在或为空,这些方法将返回值false
。
注意
id Alias
从 Laravel MongoDB v 5.1 开始,getColumns()
方法将MongoDB集合中的 _id
字段名称表示为返回的字段名称列表中的别名 id
。您可以将 _id
或 id
传递给 hasColumn()
和 hasColumns()
方法。
例子
以下示例将集合名称传递给Schema::getColumns()
方法以检索flowers
集合中的每个字段:
$fields = Schema::getColumns('flowers');
创建和拖放集合
要了解如何创建和删除集合,请参阅模式生成器指南中的执行 Laravel 迁移部分。