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', ] ], ...
注意
当您使用相同的连接字符串创建两个客户端时, 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 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 官方博客上的 Laravel:新数据库命令。
调用数据库或模式方法
您可以通过在应用程序中调用以下方法来列出数据库中的集合:
DB::listCollections():使用查询构建器列出有关每个集合的信息Schema::getTablesListing():使用模式构建器列出每个集合的名称Schema::getTables():使用模式构建器列出每个集合的名称和大小
注意
MongoDB是一个模式灵活的数据库,因此前面的模式构建器方法查询数据库数据而不是模式。
例子
以下示例访问连接的数据库,然后调用 listCollections()查询构建器方法来检索有关数据库中集合的信息:
$collections = DB::connection('mongodb')->getDatabase()->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 迁移部分。
删除数据库
To delete a database from your MongoDB deployment, call the getMongoClient() method on the DB facade to access your client. Then, call the MongoDB PHP Library's dropDatabase() method and pass the name of the database to delete as an argument.
以下示例删除名为 test_database 的数据库:
$client = DB::getMongoClient(); $client->dropDatabase('test_database');
运行命令
您可以通过在数据库连接实例上调用command()方法来直接在数据库上运行MongoDB命令。
要运行命令,请调用command()方法并向其传递包含该命令及其参数的文档。
以下示例对使用 sample_mflix 数据库的数据库连接实例执行这些操作:
创建引用
sample_mflix数据库的数据库连接实例指定用于检索
sample_mflix数据库中的集合和视图列表的命令打印命令返回的每个结果的
name字段的值
该示例调用command()方法来运行listCollections命令。 此方法返回一个游标,其中包含数据库中每个集合的结果文档。
$cursor = DB::connection('mongodb') ->command(['listCollections' => 1]); foreach ($cursor as $coll) { echo $coll['name'] . "<br>\n"; }
提示
要学习;了解有关运行MongoDB 数据库命令的更多信息,请参阅服务器手册中的数据库命令。