Title: Simple Embeded Document Model Author: Dariusz Górecki --- To fully understand this example please refer to [Embedded Documents Models Section][basic.embedded-documents] To use embedded documents you need to do two steps: - First create model for embedded document (we will add address as embedded document to User model from previous [example][basic.simple-model] ): ~~~ [php] /** * Note that we extending EMongoEmbeddedDocument, not regular EMongoDocument class * this is for performance reasons, embedded documents do not need to have, all * connection, and collection management stuff, this is explained in [Embedded Documents Models Section][basic.embeddedDocuments] * * NOTE: You may define regular EMongoDocument as an embedded in another one, if you really want to, it will still work */ class UserAddress extends EMongoEmbeddedDocument { public $apartment; public $house; public $street; public $city; public $zip; // We may define rules for embedded document too public function rules() { return array( array('apartment, house, street, city, zip', 'required'), // ... ); } // And attribute names too public function attributeNames() { /* ... */ } // NOTE: for embedded documents we do not define static model method! // we do not define getCollectionName method either. } ~~~ - Next we have to define `embeddedDocuments()` method in model that will contain embedded document Add `embeddedDocument()` method to previous `User` model example: ~~~ [php] class User extends EMongoDocument { // ... /** * This method should return simple array that will define field names for embedded * documents, and class to use for them */ public function embeddedDocuments() { return array( // property field name => class name to use for this embedded document 'address' => 'UserAddress', ); } // ... } ~~~ Now, the fun part starts! We can now do things like: ~~~ [php] $user = new User(); $user->address->city = 'New York'; $user->address->street = 'Some street name'; // This will save user to users collection, with UserAddress embedded document set, // and this handle with validation of embedded documents too! $user->save(); // After that: $user = User::model()->find(); // Models will be automatically populated with embedded documents that they contain, // so we can do: echo $user->address->city; ~~~