212 lines
5.7 KiB
ReStructuredText
212 lines
5.7 KiB
ReStructuredText
YAML Mapping
|
|
============
|
|
|
|
The YAML mapping driver enables you to provide the ODM metadata in
|
|
form of YAML documents.
|
|
|
|
The YAML mapping document of a class is loaded on-demand the first
|
|
time it is requested and subsequently stored in the metadata cache.
|
|
In order to work, this requires certain conventions:
|
|
|
|
-
|
|
Each document/mapped superclass must get its own dedicated YAML
|
|
mapping document.
|
|
-
|
|
The name of the mapping document must consist of the fully
|
|
qualified name of the class, where namespace separators are
|
|
replaced by dots (.).
|
|
-
|
|
All mapping documents should get the extension ".dcm.yml" to
|
|
identify it as a Doctrine mapping file. This is more of a
|
|
convention and you are not forced to do this. You can change the
|
|
file extension easily enough.
|
|
|
|
-
|
|
|
|
.. code-block:: php
|
|
|
|
<?php
|
|
|
|
$driver->setFileExtension('.yml');
|
|
|
|
It is recommended to put all YAML mapping documents in a single
|
|
folder but you can spread the documents over several folders if you
|
|
want to. In order to tell the YamlDriver where to look for your
|
|
mapping documents, supply an array of paths as the first argument
|
|
of the constructor, like this:
|
|
|
|
.. code-block:: php
|
|
|
|
<?php
|
|
|
|
// $config instanceof Doctrine\ODM\MongoDB\Configuration
|
|
$driver = new YamlDriver(array('/path/to/files'));
|
|
$config->setMetadataDriverImpl($driver);
|
|
|
|
Simplified YAML Driver
|
|
~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The Symfony project sponsored a driver that simplifies usage of the YAML Driver.
|
|
The changes between the original driver are:
|
|
|
|
1. File Extension is .mongodb-odm.yml
|
|
2. Filenames are shortened, "MyProject\\Documents\\User" will become User.mongodb-odm.yml
|
|
3. You can add a global file and add multiple documents in this file.
|
|
|
|
Configuration of this client works a little bit different:
|
|
|
|
.. code-block:: php
|
|
|
|
<?php
|
|
$namespaces = array(
|
|
'/path/to/files1' => 'MyProject\Documents',
|
|
'/path/to/files2' => 'OtherProject\Documents'
|
|
);
|
|
$driver = new \Doctrine\ODM\MongoDB\Mapping\Driver\SimplifiedYamlDriver($namespaces);
|
|
$driver->setGlobalBasename('global'); // global.mongodb-odm.yml
|
|
|
|
Example
|
|
-------
|
|
|
|
As a quick start, here is a small example document that makes use
|
|
of several common elements:
|
|
|
|
.. code-block:: yaml
|
|
|
|
# Documents.User.dcm.yml
|
|
|
|
Documents\User:
|
|
db: documents
|
|
collection: user
|
|
fields:
|
|
id:
|
|
id: true
|
|
username:
|
|
name: login
|
|
type: string
|
|
email:
|
|
unique:
|
|
order: desc
|
|
createdAt:
|
|
type: date
|
|
indexes:
|
|
index1:
|
|
keys:
|
|
username: desc
|
|
options:
|
|
unique: true
|
|
dropDups: true
|
|
safe: true
|
|
embedOne:
|
|
address:
|
|
targetDocument: Documents\Address
|
|
embedMany:
|
|
phonenumbers:
|
|
targetDocument: Documents\Phonenumber
|
|
referenceOne:
|
|
profile:
|
|
targetDocument: Documents\Profile
|
|
cascade: all
|
|
account:
|
|
targetDocument: Documents\Account
|
|
cascade: all
|
|
referenceMany:
|
|
groups:
|
|
targetDocument: Documents\Group
|
|
cascade: all
|
|
|
|
# Alternative syntax for the exact same example
|
|
# (allows custom key name for embedded document and reference).
|
|
Documents\User:
|
|
db: documents
|
|
collection: user
|
|
fields:
|
|
id:
|
|
id: true
|
|
username:
|
|
name: login
|
|
type: string
|
|
email:
|
|
unique:
|
|
order: desc
|
|
createdAt:
|
|
type: date
|
|
address:
|
|
embedded: true
|
|
type: one
|
|
targetDocument: Documents\Address
|
|
phonenumbers:
|
|
embedded: true
|
|
type: many
|
|
targetDocument: Documents\Phonenumber
|
|
profile:
|
|
reference: true
|
|
type: one
|
|
targetDocument: Documents\Profile
|
|
cascade: all
|
|
account:
|
|
reference: true
|
|
type: one
|
|
targetDocument: Documents\Account
|
|
cascade: all
|
|
groups:
|
|
reference: true
|
|
type: many
|
|
targetDocument: Documents\Group
|
|
cascade: all
|
|
indexes:
|
|
index1:
|
|
keys:
|
|
username: desc
|
|
options:
|
|
unique: true
|
|
dropDups: true
|
|
safe: true
|
|
|
|
Be aware that class-names specified in the YAML files should be fully qualified.
|
|
|
|
.. note::
|
|
|
|
The ``name`` property is an optional setting to change name of the field
|
|
**in the database**. Specifying it is optional and defaults to the name
|
|
of mapped field.
|
|
|
|
Reference
|
|
---------
|
|
|
|
.. _yml_reference_lock:
|
|
|
|
Lock
|
|
^^^^
|
|
|
|
The field with the ``lock`` property will be used to store lock information for :ref:`pessimistic locking <transactions_and_concurrency_pessimistic_locking>`.
|
|
This is only compatible with the ``int`` field type, and cannot be combined with ``id: true``.
|
|
|
|
.. code-block:: yaml
|
|
|
|
lock:
|
|
type: int
|
|
lock: true
|
|
|
|
.. _yml_reference_version:
|
|
|
|
Version
|
|
^^^^^^^
|
|
|
|
The field with the ``version`` property will be used to store version information for :ref:`optimistic locking <transactions_and_concurrency_optimistic_locking>`.
|
|
This is only compatible with ``int`` and ``date`` field types, and cannot be combined with ``id: true``.
|
|
|
|
.. code-block:: yaml
|
|
|
|
version:
|
|
type: int
|
|
version: true
|
|
|
|
By default, Doctrine ODM updates :ref:`embed-many <embed_many>` and
|
|
:ref:`reference-many <reference_many>` collections in separate write operations,
|
|
which do not bump the document version. Users employing document versioning are
|
|
encouraged to use the :ref:`atomicSet <atomic_set>` or
|
|
:ref:`atomicSetArray <atomic_set_array>` strategies for such collections, which
|
|
will ensure that collections are updated in the same write operation as the
|
|
versioned parent document.
|