You are browsing a version that is no longer maintained.

Embedded Mapping

This chapter explains how embedded documents are mapped in Doctrine.

Embed One

Embed a single document:

1<?php /** @Document */ class User { // ... /** @EmbedOne(targetDocument="Address") */ private $address; // ... } /** @EmbeddedDocument */ class Address { // ... }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Embed Many

Embed many documents:

1<?php /** @Document */ class User { // ... /** @EmbedMany(targetDocument="Phonenumber") */ private $phonenumbers = array(); // ... } /** @EmbeddedDocument */ class Phonenumber { // ... }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Mixing Document Types

If you want to store different types of embedded documents in the same field, you can simply omit the targetDocument option:

1<?php /** @Document */ class User { // .. /** @EmbedMany */ private $tasks = array(); // ... }
2
3
4
5
6
7
8
9
10
11
12

Now the $tasks property can store any type of document! The class name will be automatically stored in a field named _doctrine_class_name within the embedded document. The field name can be customized with the discriminatorField option:

1<?php /** @Document */ class User { // .. /** * @EmbedMany(discriminatorField="type") */ private $tasks = array(); // ... }
2
3
4
5
6
7
8
9
10
11
12
13
14

You can also specify a discriminator map to avoid storing the fully qualified class name in each embedded document:

1<?php /** @Document */ class User { // .. /** * @EmbedMany( * discriminatorMap={ * "download"="DownloadTask", * "build"="BuildTask" * } * ) */ private $tasks = array(); // ... }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

If you have embedded documents without a discriminator value that need to be treated correctly you can optionally specify a default value for the discriminator:

1<?php /** @Document */ class User { // .. /** * @EmbedMany( * discriminatorMap={ * "download"="DownloadTask", * "build"="BuildTask" * }, * defaultDiscriminatorValue="download" * ) */ private $tasks = array(); // ... }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Cascading Operations

All operations on embedded documents are automatically cascaded. This is because embedded documents are part of their parent document and cannot exist without those by nature.