-
Notifications
You must be signed in to change notification settings - Fork 1.5k
DOCSP-35934: databases and collections #2816
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 5 commits
7397ca6
9c313fd
c8263c0
cfcf100
2cbf27e
37c3940
d3e9691
95ed1df
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||
---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,176 @@ | ||||||||
.. _laravel-db-coll: | ||||||||
|
||||||||
========================= | ||||||||
Databases and Collections | ||||||||
========================= | ||||||||
|
||||||||
.. facet:: | ||||||||
:name: genre | ||||||||
:values: reference | ||||||||
|
||||||||
.. meta:: | ||||||||
:keywords: php framework, odm | ||||||||
|
||||||||
.. contents:: On this page | ||||||||
:local: | ||||||||
:backlinks: none | ||||||||
:depth: 2 | ||||||||
:class: singlecol | ||||||||
|
||||||||
Overview | ||||||||
-------- | ||||||||
|
||||||||
In this guide, you can learn how to use {+odm-short+} to access | ||||||||
and manage MongoDB databases and collections. | ||||||||
|
||||||||
MongoDB organizes data in a hierarchical structure. A MongoDB | ||||||||
deployment contains one or more **databases**, and each database | ||||||||
contains one or more **collections**. In each collection, MongoDB stores | ||||||||
data as **documents** that contain field-and-value pairs. In | ||||||||
{+odm-short+}, you can access documents through Eloquent models. | ||||||||
|
||||||||
To learn more about the document data format, | ||||||||
see :manual:`Documents </core/document/>` in the Server manual. | ||||||||
|
||||||||
.. _laravel-access-db: | ||||||||
|
||||||||
Specify the Database in a Connection Configuration | ||||||||
-------------------------------------------------- | ||||||||
|
||||||||
You specify a database name when configuring a connection in your | ||||||||
application's ``config/database.php`` file. The ``connections`` property | ||||||||
in this file stores all of your database connection information, such as | ||||||||
your connection string, database name, and optionally, authentication | ||||||||
details. After you specify a database connection, you can perform | ||||||||
database-level operations and access collections that the database | ||||||||
contains. | ||||||||
|
||||||||
If you set the database name in a connection string to the name of a | ||||||||
nonexistent database, Laravel still makes a valid connection. When you | ||||||||
insert any data into a collection in the database, the server creates it | ||||||||
automatically. | ||||||||
|
||||||||
The following example shows how to set a default database connection and | ||||||||
create a database connection to the ``animals`` database in the | ||||||||
``config/database.php`` file: | ||||||||
|
||||||||
.. code-block:: php | ||||||||
:emphasize-lines: 7 | ||||||||
|
||||||||
'default' => 'mongodb', | ||||||||
|
||||||||
'connections' => [ | ||||||||
|
||||||||
'mongodb' => [ | ||||||||
'driver' => 'mongodb', | ||||||||
'dsn' => 'mongodb://localhost:27017/animals', | ||||||||
GromNaN marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||
], ... | ||||||||
] | ||||||||
|
||||||||
When you set a default database connection, {+odm-short+} uses that | ||||||||
connection for operations, but you can specify multiple database connections | ||||||||
in your ``config/database.php`` file. | ||||||||
|
||||||||
The following example shows how to specify multiple database connections | ||||||||
(``mongodb`` and ``mongodb_alt``) to access the ``animals`` and | ||||||||
``plants`` databases: | ||||||||
GromNaN marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||
|
||||||||
.. code-block:: php | ||||||||
|
||||||||
'connections' => [ | ||||||||
|
||||||||
'mongodb' => [ | ||||||||
'driver' => 'mongodb', | ||||||||
'dsn' => 'mongodb://localhost:27017/animals', | ||||||||
], | ||||||||
|
||||||||
'mongodb_alt' => [ | ||||||||
'driver' => 'mongodb', | ||||||||
'dsn' => 'mongodb://localhost:27017/plants', | ||||||||
] | ||||||||
|
||||||||
], ... | ||||||||
|
||||||||
.. note:: | ||||||||
|
||||||||
The MongoDB PHP driver reuses the same connection when | ||||||||
you create two clients with the same connection string. There is no | ||||||||
overhead in using two connections for two distinct databases, so you | ||||||||
do not need to optimize your connections. | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'll note that if users expect to change the database name for separate connections, that would result in the driver not re-using the same connection since the connection string (i.e. This relates to my suggestion in https://github.com/mongodb/laravel-mongodb/pull/2816/files#r1559726362 to encourage users not to specify any "auth database" in the connection string, which the Laravel library just so happens to use as a "default" database. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for the information! Since i modified the multiple connections example to specify the default db in the connection strings, should I remove this note then? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm asking @GromNaN above, but I very much dislike the example being presented here. If there's any way we can change this to avoid using the "auth database" URI component, I'd like to see it. I can confirm that this paragraph is no longer relevant given the current state of the PR, but the fact that it's now creating multiple database connections is very disagreeable to me. This doesn't feel like something we should be conveying so simply in docs that some users are bound to copy/paste as reference. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The correct configuration should be to extract the database into a dedicated config: 'connections' => [
'mongodb' => [
'driver' => 'mongodb',
'dsn' => 'mongodb://localhost:27017/',
'database' => 'animals',
],
'mongodb_alt' => [
'driver' => 'mongodb',
'dsn' => 'mongodb://localhost:27017/',
'database' => 'plants',
]
], ... |
||||||||
|
||||||||
If your application contains multiple database connections and you want | ||||||||
to store your model in a database other than the default, override the | ||||||||
``$connection`` property when creating a ``Model`` class. | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Suggestion: I think it's only necessary to mention where to make the change.
Suggested change
|
||||||||
|
||||||||
The following example shows how to override the ``$connection`` property | ||||||||
on the ``Flower`` model class to use the ``mongodb_alt`` connection. | ||||||||
This directs {+odm-short+} to store the model in the ``flowers`` | ||||||||
collection of the ``plants`` database, instead of in the default database: | ||||||||
|
||||||||
.. code-block:: php | ||||||||
|
||||||||
class Flower extends Model | ||||||||
{ | ||||||||
protected $connection = 'mongodb_alt'; | ||||||||
} | ||||||||
|
||||||||
.. _laravel-access-coll: | ||||||||
|
||||||||
Access a Collection | ||||||||
------------------- | ||||||||
|
||||||||
When you create model class that extends | ||||||||
``MongoDB\Laravel\Eloquent\Model``, {+odm-short+} stores the model data | ||||||||
in a collection with a name that is the snake case plural form of your | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Suggestion: No change necessary, but I just thought this wording might flow better:
Suggested change
|
||||||||
model class name. | ||||||||
|
||||||||
For example, if you create a model class called ``Flower``, | ||||||||
Laravel applies the model to the ``flowers`` collection in the database. | ||||||||
|
||||||||
.. tip:: | ||||||||
|
||||||||
To learn how to specify a different collection name when defining a model class, see the | ||||||||
:ref:`laravel-model-customize-collection-name` section of the Eloquent | ||||||||
Model Class guide. | ||||||||
|
||||||||
We generally recommend that you use the Eloquent ORM to access a collection | ||||||||
implicitly for code readability and maintainability. The following | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Suggestion:
Suggested change
|
||||||||
example specifies a find operation by using the ``Flower`` class, so | ||||||||
Laravel retrieves results from the ``flowers`` collection: | ||||||||
|
||||||||
.. code-block:: php | ||||||||
|
||||||||
Flower::where('name', 'Water Lily')->get() | ||||||||
|
||||||||
If you are not able to accomplish your operation by using an Eloquent | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (correcting my prior suggestion)
Suggested change
|
||||||||
model, you can access a collection by using a facade to access the query | ||||||||
builder class ``DB`` and calling the ``collection()`` method. The | ||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Suggestion: I think it can be more concise to use the "DB facade" nomenclature which the Laravel docs use.
Suggested change
|
||||||||
following example shows the same query as in the preceding example, but | ||||||||
the query is constructed by using the ``DB::collection()`` method: | ||||||||
|
||||||||
.. code-block:: php | ||||||||
|
||||||||
DB::connection('mongodb') | ||||||||
->collection('flowers') | ||||||||
->where('name', 'Water Lily') | ||||||||
->get() | ||||||||
|
||||||||
List Collections | ||||||||
---------------- | ||||||||
|
||||||||
To see information about each of the collections in a database, call the | ||||||||
``listCollections()`` method. | ||||||||
|
||||||||
The following example accesses a database connection, then | ||||||||
calls the ``listCollections()`` method to retrieve information about the | ||||||||
collections in the database: | ||||||||
|
||||||||
.. code-block:: php | ||||||||
|
||||||||
$collections = DB::connection('mongodb')->getMongoDB()->listCollections(); | ||||||||
|
||||||||
Create and Drop Collections | ||||||||
--------------------------- | ||||||||
|
||||||||
To learn how to create and drop collections, see the | ||||||||
:ref:`laravel-eloquent-migrations` section in the Schema Builder guide. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Suggestion:
I think this sentence specifies a time ("when"), but I don't think it's connected to any sequence of instructions we provide. I think the following sentence could avoid associating it with an order:
You can configure the name of the database that a connection uses in your application's config/database.php configuration file.