• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Symfony Day 2010 Doctrine MongoDB ODM
 

Symfony Day 2010 Doctrine MongoDB ODM

on

  • 9,134 views

 

Statistics

Views

Total Views
9,134
Views on SlideShare
7,821
Embed Views
1,313

Actions

Likes
16
Downloads
147
Comments
0

22 Embeds 1,313

http://nosql.mypopescu.com 625
http://www.symfony.es 196
http://www.charnad.com 146
http://test.ical.ly 97
http://blog.fotocommunity.net 93
http://www.ausgebloggt.de 59
http://www.testically.org 18
http://feeds2.feedburner.com 16
http://coderwall.com 11
http://static.slidesharecdn.com 9
http://www.fotocommunity.de 9
http://www.sfexception.com 8
http://feeds.feedburner.com 5
http://symfony.lab216.com 5
http://theoldreader.com 5
http://dashboard.bloglines.com 3
http://xss.yandex.net 2
http://webcache.googleusercontent.com 2
https://twitter.com 1
http://translate.googleusercontent.com 1
http://www.inoreader.com 1
https://flyproxy.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Symfony Day 2010 Doctrine MongoDB ODM Symfony Day 2010 Doctrine MongoDB ODM Presentation Transcript

    • Doctrine MongoDB Object Document Manager #sfdaycgn Doctrine MongoDB Object Document Mapper (ODM) www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn What is Doctrine? www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn What is Doctrine? • Open source PHP project started in 2006 • Relational database abstraction layer. • mysql, oracle, pgsql, sqlite, etc. • Object persistence layers for RDBMS, MongoDB, etc. • Other database related functionalities. http://www.doctrine-project.org www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn What is MongoDB? • Key-Value document based storage system. • Bridge between traditional relational databases and key-value data stores. http://www.mongodb.org www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Terminology RDBMS MongoDB Database Database Table Collection Row Document www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Using MongoDB in PHP www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Connecting $mongo = new Mongo('mongodb://localhost'); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Selecting Databases $mongo = new Mongo('mongodb://localhost'); $db = $mongo->selectDB('dbname'); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Selecting Collections $mongo = new Mongo('mongodb://localhost'); $db = $mongo->selectDB('dbname'); $coll = $db->selectCollection('users'); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Inserting Documents Insert a new user document and echo the newly generated id $user = array( 'username' => 'jwage', 'password' => md5('changeme') 'active' => true ); $coll->insert($user); echo $user['_id']; www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Updating Documents Update username and password and save the whole document $user = $coll->findOne(array('username' => 'jwage')); $user['username'] = 'jonwage'; $user['password'] = md5('newpassword'); $coll->save($user); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Atomic Updates • Faster than saving the entire document. • Safer than updating the entire document. • Updates are done in place and are atomic. www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Atomic Updates Update username and password where username is jwage $coll->update(array( 'username' => 'jwage' ), array( '$set' => array( 'username' => 'jonwage', 'password' => md5('newpassword') ) )); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Atomic Updates Many other atomic operators exist for manipulating a documents data • $inc - increments field by the number value • $set - sets field to value • $unset - deletes a given field • $push - appends value to an array • $pushAll - appends multiple values to an array • $addToSet - appends multiple values to an array that don’t already exist in the array • $pop - removes the last element in an array • $pull - removes all occurrences of a value from an array • $pullAll - removes all occurrences of multiple values from an array www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Removing Documents $coll->remove(array('username' => 'jwage')); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Doctrine + MongoDB www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn DocumentManager • Abstraction on top of the PHP Mongo class • Manages the persistent state of PHP objects • Implements UnitOfWork for change tracking http://martinfowler.com/eaaCatalog/unitOfWork.html www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Document States • A NEW document instance has no persistent identity, and is not yet associated with a DocumentManager (i.e. those just created with the "new" operator). • A MANAGED document instance is an instance with a persistent identity that is associated with an DocumentManager and whose persistence is thus managed. • A DETACHED document instance is an instance with a persistent identity that is not (or no longer) associated with an DocumentManager. • A REMOVED document instance is an instance with a persistent identity, associated with an DocumentManager, that will be removed from the database upon transaction commit. www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn DocumentManager Create your DocumentManager instance for managing object persistence $config = new DoctrineODMMongoDBConfiguration(); $config->setMetadataCacheImpl(new DoctrineCommonCacheArrayCache); $driverImpl = $config->newDefaultAnnotationDriver(array(__DIR__."/Documents")); $config->setMetadataDriverImpl($driverImpl); $config->setProxyDir(__DIR__ . '/Proxies'); $config->setProxyNamespace('Proxies'); $dm = DoctrineORMDocumentManager::create($mongo, $config); Wraps around existing $mongo connection www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Defining Document A document is just a regular ole’ PHP class class User { private $id; private $username; private $password; public function getId() { return $this->id; } public function getUsername() { return $this->username; } public function setUsername($username) { $this->username = $username; } public function getPassword() { return $this->password; } public function setPassword($password) { $this->password = md5($password); } } www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Mapping the Document /** @Document */ class User { /** @Id */ private $id; /** @String */ private $username; /** @String */ private $password; // ... } www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Ready to Go Doctrine now knows about this document and is able to manage its persistent state www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Inserting, Updating and Deleting Documents www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Inserting Documents $user = new User(); $user->setUsername('jwage'); $user->setPassword('changeme'); $dm->persist($user); $dm->flush(); // inserts document $users = array( array( 'username' => 'jwage', 'password' => 'changeme' ) ); $coll->batchInsert($users); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Updating Documents $user = $dm->findOne('User', array('username' => 'jwage')); $user->setUsername('jonwage'); $user->setPassword('newpassword'); $dm->flush(); // updates document $coll->update( array('_id' => 'theid'), array('$set' => array( 'username' => 'jonwage', 'password' => '5e9d11a14ad1c8dd77e98ef9b53fd1ba' ) ); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Removing Documents $user = $dm->findOne('User', array('username' => 'jwage')); $dm->remove($user); $dm->flush(); // removes document $coll->remove(array('_id' => 'theid')); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Query API Fluent OO Query API www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Querying MongoDB Directly // Get user array directly from mongo $user = $mongo->db->users->findOne(array('username' => 'jwage')); Returns an array of information and not a User object www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Querying Through Doctrine // Get user class instance through Doctrine $user = $dm->findOne('User', array('username' => 'jwage')); Going through Doctrine gives you managed objects back instead of arrays www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Querying Through Doctrine Query API // Get user class instance through Doctrine Query API $user = $dm->createQuery('User') ->field('username')->equals('jwage') ->getSingleResult(); Query for same user using the Query API www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Querying Through Doctrine Query API // Find posts within a range of dates $posts = $dm->createQuery('Post') ->field('createdAt')->range($startDate, $endDate) ->execute(); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Updating Documents // Update a document $dm->createQuery('User') ->update() ->field('username')->set('jonwage') ->field('password')->set('newpassword') ->field('username')->equals('jwage') ->execute(); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Removing Documents // Remove a document $dm->createQuery('User') // Remove a document $dm->createQuery('User') ->remove() ->remove() ->field('username')->equals('jwage') ->execute(); ->field('username')->equals('jwage') ->execute(); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Embedded Documents www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn class User { /** @Id */ public $id; /** @String */ public $name; /** @EmbedMany(targetDocument="Address") */ public $addresses = array(); } www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn /** @EmbeddedDocument */ class Address { /** @String */ public $address; /** @String */ public $city; /** @String */ public $state; /** @String */ public $zipcode; } www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn $user = new User(); $user->name = 'Jonathan H. Wage'; $address = new Address(); $address->address = '6512 Mercomatic Ct'; $address->city = 'Nashville'; $address->state = 'Tennessee'; $address->zipcode = '37209'; $user->addresses[] = $address; $dm->persist($user); $dm->flush(); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn $users = array( array( 'name' => 'Jonathan H. Wage', 'addresses' => array( array( 'address' => '6512 Mercomatic Ct', 'city' => 'Nashville', 'state' => 'Tennesseee', 'zipcode' => '37209' ) ) ) ); $coll->batchInsert($users); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Updating Embedded Documents Uses dot notation and atomic operators for updating www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn $user = $dm->findOne('User', array('name' => 'Jonathan H. Wage')); $user->addresses[0]->zipcode = '37205'; $dm->flush(); $coll->update( array('_id' => 'theuserid'), array('$set' => array('addresses.0.zipcode' => '37209')) ); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Add New Address www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn $user = $dm->findOne('User', array('name' => 'Jonathan H. Wage')); $address = new Address(); $address->address = '475 Buckhead Ave.'; $address->city = 'Atlanta'; $address->state = 'Georgia'; $address->zipcode = '30305'; $user->addresses[] = $address; $dm->flush(); $coll->update( array('_id' => 'theuserid'), array('$pushAll' => array( 'addresses' => array( array( 'address' => '475 Buckhead Ave.', 'city' => 'Atlanta', 'state' => 'Georgia', 'zipcode' => '30305' ) ) )) ); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn unset($user->addresses[0]->zipcode); $dm->flush(); $coll->update( array('_id' => 'theuserid'), array( '$unset' => array( 'addresses.0.zipcode' => 1 ) ) ); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn References MongoDB does not have joins or foreign keys but you can still store references to other documents and resolve the references in your application code. Doctrine abstracts the handling of referneces for you so working with them is seamless. www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Organization /** @Document */ class Organization { /** @Id */ private $id; /** @String */ private $name; /** @ReferenceMany(targetDocument="User") */ private $users = array(); public function setName($name) { $this->name = $name; } public function addUser(User $user) { $this->users[] = $user; } } www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn User /** @Document */ class User { /** @Id */ private $id; /** @String */ private $name; /** @ReferenceOne(targetDocument="Organization") */ private $organization; public function setName($name) { $this->name = $name; } public function setOrganization(Organization $organization) { $this->organization = $organization; $organization->addUser($this); } } www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn $organization = new Organization(); $organization->setName('Sensio Labs'); $user = new User(); $user->setName('Jonathan H. Wage'); $user->setOrganization($organization); $dm->persist($organization); $dm->persist($user); $dm->flush(); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn The Result www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Array ( [_id] => 4c86acd78ead0e8759000000 [name] => Sensio Labs [users] => Array ( [0] => Array ( [$ref] => User [$id] => 4c86acd78ead0e8759010000 [$db] => doctrine_odm_sandbox ) ) ) Array ( [_id] => 4c86acd78ead0e8759010000 [name] => Jonathan H. Wage [organization] => Array ( [$ref] => Organization [$id] => 4c86acd78ead0e8759000000 [$db] => doctrine_odm_sandbox ) ) www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Working with References www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn $user = $dm->find('User', array('name' => 'Jonathan H. Wage')); // instance of uninitialized OrganizationProxy $organization = $user->getOrganization(); // calling getter or setter for uninitialized proxy // queries the database and initialized the proxy document // query invoked, organization data loaded and doc initialized echo $organization->getName(); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn $organization = $dm->find('Organization', array('name' => 'Sensio Labs')); $users = $organization->getUsers(); // uninitialized collection // Queries database for users and initializes collection foreach ($users as $user) { // ... } www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Change Tracking www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn UnitOfWork • Tracks changes in objects between flushes • Maintains copy of old values to compare new values to • Changesets computed and persisted in the most efficient way using atomic operators $inc, $set, $unset, $pullAll, $pushAll, etc. www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Other Features www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Document Query Language Language for querying documents in a similar way to SQL www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn BNF Grammar www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn QueryLanguage ::= FindQuery | InsertQuery | UpdateQuery | RemoveQuery FindQuery ::= FindClause [WhereClause] [MapClause] [ReduceClause] [SortClause] [LimitClause] [SkipClause] FindClause ::= "FIND" all | SelectField {"," SelectField} SelectField ::= DocumentFieldName SortClause ::= SortClauseField {"," SortClauseField} SortClauseField ::= DocumentFieldName "ASC | DESC" LimitClause ::= "LIMIT" LimitInteger SkipClause ::= "SKIP" SkipInteger MapClause ::= "MAP" MapFunction ReduceClause ::= "REDUCE" ReduceFunction DocumentFieldName ::= DocumentFieldName | EmbeddedDocument "." {"." DocumentFieldName} WhereClause ::= "WHERE" WhereClausePart {"AND" WhereClausePart} WhereClausePart ::= ["all", "not"] DocumentFieldName WhereClauseExpression Value WhereClauseExpression ::= "=" | "!=" | ">=" | "<=" | ">" | "<" | "in" "notIn" | "all" | "size" | "exists" | "type" Value ::= LiteralValue | JsonObject | JsonArray UpdateQuery ::= UpdateClause [WhereClause] UpdateClause ::= [SetExpression], [UnsetExpression], [IncrementExpression], [PushExpression], [PushAllExpression], [PullExpression], [PullAllExpression], [AddToSetExpression], [AddManyToSetExpression], [PopFirstExpression], [PopLastExpression] SetExpression ::= "SET" DocumentFieldName "=" Value {"," SetExpression} UnsetExpression ::= "UNSET" DocumentFieldName {"," UnsetExpression} IncrementExpression ::= "INC" DocumentFieldName "=" IncrementInteger {"," IncrementExpression} PushExpression ::= "PUSH" DocumentFieldName Value {"," PushExpression} PushAllExpression ::= "PUSHALL" DocumentFieldName Value {"," PushAllExpression} PullExpression ::= "PULL" DocumentFieldName Value {"," PullExpression} PullAllExpression ::= "PULLALL" DocumentFieldName Value {"," PullAllExpression} AddToSetExpression ::= "ADDTOSET" DocumentFieldName Value {"," AddToSetExpression} AddManyToSetExpression ::= "ADDMANYTOSET" DocumentFieldName Value {"," AddManyToSetExpression} PopFirstExpression ::= "POPFIRST" DocumentFieldName {"," PopFirstExpression} PopLastExpression ::= "POPLAST" DocumentFieldName {"," PopLastExpression} InsertQuery ::= InsertClause InsertSetClause {"," InsertSetClause} InsertSetClause ::= DocumentFieldName "=" Value RemoveQuery ::= RemoveClause [WhereClause] www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Creating Query $users = $dm->query('find all FROM User'); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Selecting Fields $users = $dm->query('find username FROM User'); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Paging Results $users = $dm->query('find all FROM User limit 30 skip 30'); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Selecting Slice of Embedded Documents $post = $dm->query('find title, comments limit 20 skip 10 FROM BlogPost WHERE id = ?', array($id)); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Other Examples // Find all posts greater than or equal to a date $posts = $dm->query('find all FROM BlogPost WHERE createdAt >= ?', array($date)); // Find all posts sorted by created at desc $posts = $dm->query('find all FROM BlogPost sort createdAt desc'); // Update user $dm->query('update DocumentsUser set password = ? where username = ?', array('newpassword', 'jwage')); www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Lifecycle Events www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn “A lifecycle event is a regular event with the additional feature of providing a mechanism to register direct callbacks inside the corresponding document classes that are executed when the lifecycle event occurs.” http://www.doctrine-project.org/projects/mongodb_odm/1.0/docs/reference/events/en#lifecycle-callbacks www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn • preRemove - The preRemove event occurs for a given document before the respective DocumentManager remove operation for that document is executed. • postRemove - The postRemove event occurs for an document after the document has been removed. It will be invoked after the database delete operations. • prePersist - The prePersist event occurs for a given document before the respective DocumentManager persist operation for that document is executed. • postPersist - The postPersist event occurs for an document after the document has been made persistent. It will be invoked after the database insert operations. Generated primary key values are available in the postPersist event. • preUpdate - The preUpdate event occurs before the database update operations to document data. • postUpdate - The postUpdate event occurs after the database update operations to document data. • postLoad - The postLoad event occurs for an document after the document has been loaded into the current DocumentManager from the database or after the refresh operation has been applied to it. www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Event Examples www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn /** * @Document * @HasLifecycleCallbacks */ class BlogPost { /** @Id */ public $id; /** @Date */ public $createdAt; /** @Date */ public $updatedAt; /** @PreUpdate */ public function prePersist() { $this->createdAt = new DateTime(); } /** @PreUpdate */ public function preUpdate() { $this->updatedAt = new DateTime(); } } www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Migrating Data www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Initial Document /** * @Document */ class User { /** @Id */ public $id; /** @String */ public $name; } www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn New Document /** * @Document */ class User { /** @Id */ public $id; /** @String */ public $firstName; /** @String */ public $lastName; } www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Migrate Documents With Old Field Name /** * @Document * @HasLifecycleCallbacks */ class User { /** @Id */ public $id; /** @String */ public $firstName; /** @String */ public $lastName; /** @PreLoad */ public function preLoad(array &$data) { if (isset($data['name'])) { $e = explode(' ', $data['name']); unset($data['name']); $data['firstName'] = $e[0]; $data['lastName'] = $e[1]; } } www.doctrine-project.org www.sensiolabs.org
    • Doctrine MongoDB Object Document Manager #sfdaycgn Questions? Jonathan H. Wage • http://www.twitter.com/jwage • http://www.jwage.com • http://www.facebook.com/jwage You can contact Jonathan about Doctrine and Open-Source or for training, consulting, application development, or business related questions at jonathan.wage@sensio.com www.doctrine-project.org www.sensiolabs.org