123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- PHP Mapping
- ===========
- Doctrine 2 also allows you to provide the ORM metadata in the form
- of plain PHP code using the ``ClassMetadata`` API. You can write
- the code in PHP files or inside of a static function named
- ``loadMetadata($class)`` on the entity class itself.
- PHP Files
- ---------
- If you wish to write your mapping information inside PHP files that
- are named after the entity and included to populate the metadata
- for an entity you can do so by using the ``PHPDriver``:
- .. code-block:: php
- <?php
- $driver = new PHPDriver('/path/to/php/mapping/files');
- $em->getConfiguration()->setMetadataDriverImpl($driver);
- Now imagine we had an entity named ``Entities\User`` and we wanted
- to write a mapping file for it using the above configured
- ``PHPDriver`` instance:
- .. code-block:: php
- <?php
- namespace Entities;
-
- class User
- {
- private $id;
- private $username;
- }
- To write the mapping information you just need to create a file
- named ``Entities.User.php`` inside of the
- ``/path/to/php/mapping/files`` folder:
- .. code-block:: php
- <?php
- // /path/to/php/mapping/files/Entities.User.php
-
- $metadata->mapField(array(
- 'id' => true,
- 'fieldName' => 'id',
- 'type' => 'integer'
- ));
-
- $metadata->mapField(array(
- 'fieldName' => 'username',
- 'type' => 'string'
- ));
- Now we can easily retrieve the populated ``ClassMetadata`` instance
- where the ``PHPDriver`` includes the file and the
- ``ClassMetadataFactory`` caches it for later retrieval:
- .. code-block:: php
- <?php
- $class = $em->getClassMetadata('Entities\User');
- // or
- $class = $em->getMetadataFactory()->getMetadataFor('Entities\User');
- Static Function
- ---------------
- In addition to the PHP files you can also specify your mapping
- information inside of a static function defined on the entity class
- itself. This is useful for cases where you want to keep your entity
- and mapping information together but don't want to use annotations.
- For this you just need to use the ``StaticPHPDriver``:
- .. code-block:: php
- <?php
- $driver = new StaticPHPDriver('/path/to/entities');
- $em->getConfiguration()->setMetadataDriverImpl($driver);
- Now you just need to define a static function named
- ``loadMetadata($metadata)`` on your entity:
- .. code-block:: php
- <?php
- namespace Entities;
-
- use Doctrine\ORM\Mapping\ClassMetadata;
-
- class User
- {
- // ...
-
- public static function loadMetadata(ClassMetadata $metadata)
- {
- $metadata->mapField(array(
- 'id' => true,
- 'fieldName' => 'id',
- 'type' => 'integer'
- ));
-
- $metadata->mapField(array(
- 'fieldName' => 'username',
- 'type' => 'string'
- ));
- }
- }
- ClassMetadataBuilder
- --------------------
- To ease the use of the ClassMetadata API (which is very raw) there is a ``ClassMetadataBuilder`` that you can use.
- .. code-block:: php
- <?php
- namespace Entities;
- use Doctrine\ORM\Mapping\ClassMetadata;
- use Doctrine\ORM\Mapping\Builder\ClassMetadataBuilder;
- class User
- {
- // ...
- public static function loadMetadata(ClassMetadata $metadata)
- {
- $builder = new ClassMetadataBuilder($metadata);
- $builder->createField('id', 'integer')->isPrimaryKey()->generatedValue()->build();
- $builder->addField('username', 'string');
- }
- }
- The API of the ClassMetadataBuilder has the following methods with a fluent interface:
- - ``addField($name, $type, array $mapping)``
- - ``setMappedSuperclass()``
- - ``setReadOnly()``
- - ``setCustomRepositoryClass($className)``
- - ``setTable($name)``
- - ``addIndex(array $columns, $indexName)``
- - ``addUniqueConstraint(array $columns, $constraintName)``
- - ``addNamedQuery($name, $dqlQuery)``
- - ``setJoinedTableInheritance()``
- - ``setSingleTableInheritance()``
- - ``setDiscriminatorColumn($name, $type = 'string', $length = 255)``
- - ``addDiscriminatorMapClass($name, $class)``
- - ``setChangeTrackingPolicyDeferredExplicit()``
- - ``setChangeTrackingPolicyNotify()``
- - ``addLifecycleEvent($methodName, $event)``
- - ``addManyToOne($name, $targetEntity, $inversedBy = null)``
- - ``addInverseOneToOne($name, $targetEntity, $mappedBy)``
- - ``addOwningOneToOne($name, $targetEntity, $inversedBy = null)``
- - ``addOwningManyToMany($name, $targetEntity, $inversedBy = null)``
- - ``addInverseManyToMany($name, $targetEntity, $mappedBy)``
- - ``addOneToMany($name, $targetEntity, $mappedBy)``
- It also has several methods that create builders (which are necessary for advanced mappings):
- - ``createField($name, $type)`` returns a ``FieldBuilder`` instance
- - ``createManyToOne($name, $targetEntity)`` returns an ``AssociationBuilder`` instance
- - ``createOneToOne($name, $targetEntity)`` returns an ``AssociationBuilder`` instance
- - ``createManyToMany($name, $targetEntity)`` returns an ``ManyToManyAssociationBuilder`` instance
- - ``createOneToMany($name, $targetEntity)`` returns an ``OneToManyAssociationBuilder`` instance
- ClassMetadataInfo API
- ---------------------
- The ``ClassMetadataInfo`` class is the base data object for storing
- the mapping metadata for a single entity. It contains all the
- getters and setters you need populate and retrieve information for
- an entity.
- General Setters
- ~~~~~~~~~~~~~~~
- - ``setTableName($tableName)``
- - ``setPrimaryTable(array $primaryTableDefinition)``
- - ``setCustomRepositoryClass($repositoryClassName)``
- - ``setIdGeneratorType($generatorType)``
- - ``setIdGenerator($generator)``
- - ``setSequenceGeneratorDefinition(array $definition)``
- - ``setChangeTrackingPolicy($policy)``
- - ``setIdentifier(array $identifier)``
- Inheritance Setters
- ~~~~~~~~~~~~~~~~~~~
- - ``setInheritanceType($type)``
- - ``setSubclasses(array $subclasses)``
- - ``setParentClasses(array $classNames)``
- - ``setDiscriminatorColumn($columnDef)``
- - ``setDiscriminatorMap(array $map)``
- Field Mapping Setters
- ~~~~~~~~~~~~~~~~~~~~~
- - ``mapField(array $mapping)``
- - ``mapOneToOne(array $mapping)``
- - ``mapOneToMany(array $mapping)``
- - ``mapManyToOne(array $mapping)``
- - ``mapManyToMany(array $mapping)``
- Lifecycle Callback Setters
- ~~~~~~~~~~~~~~~~~~~~~~~~~~
- - ``addLifecycleCallback($callback, $event)``
- - ``setLifecycleCallbacks(array $callbacks)``
- Versioning Setters
- ~~~~~~~~~~~~~~~~~~
- - ``setVersionMapping(array &$mapping)``
- - ``setVersioned($bool)``
- - ``setVersionField()``
- General Getters
- ~~~~~~~~~~~~~~~
- - ``getTableName()``
- - ``getTemporaryIdTableName()``
- Identifier Getters
- ~~~~~~~~~~~~~~~~~~
- - ``getIdentifierColumnNames()``
- - ``usesIdGenerator()``
- - ``isIdentifier($fieldName)``
- - ``isIdGeneratorIdentity()``
- - ``isIdGeneratorSequence()``
- - ``isIdGeneratorTable()``
- - ``isIdentifierNatural()``
- - ``getIdentifierFieldNames()``
- - ``getSingleIdentifierFieldName()``
- - ``getSingleIdentifierColumnName()``
- Inheritance Getters
- ~~~~~~~~~~~~~~~~~~~
- - ``isInheritanceTypeNone()``
- - ``isInheritanceTypeJoined()``
- - ``isInheritanceTypeSingleTable()``
- - ``isInheritanceTypeTablePerClass()``
- - ``isInheritedField($fieldName)``
- - ``isInheritedAssociation($fieldName)``
- Change Tracking Getters
- ~~~~~~~~~~~~~~~~~~~~~~~
- - ``isChangeTrackingDeferredExplicit()``
- - ``isChangeTrackingDeferredImplicit()``
- - ``isChangeTrackingNotify()``
- Field & Association Getters
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~
- - ``isUniqueField($fieldName)``
- - ``isNullable($fieldName)``
- - ``getColumnName($fieldName)``
- - ``getFieldMapping($fieldName)``
- - ``getAssociationMapping($fieldName)``
- - ``getAssociationMappings()``
- - ``getFieldName($columnName)``
- - ``hasField($fieldName)``
- - ``getColumnNames(array $fieldNames = null)``
- - ``getTypeOfField($fieldName)``
- - ``getTypeOfColumn($columnName)``
- - ``hasAssociation($fieldName)``
- - ``isSingleValuedAssociation($fieldName)``
- - ``isCollectionValuedAssociation($fieldName)``
- Lifecycle Callback Getters
- ~~~~~~~~~~~~~~~~~~~~~~~~~~
- - ``hasLifecycleCallbacks($lifecycleEvent)``
- - ``getLifecycleCallbacks($event)``
- ClassMetadata API
- -----------------
- The ``ClassMetadata`` class extends ``ClassMetadataInfo`` and adds
- the runtime functionality required by Doctrine. It adds a few extra
- methods related to runtime reflection for working with the entities
- themselves.
- - ``getReflectionClass()``
- - ``getReflectionProperties()``
- - ``getReflectionProperty($name)``
- - ``getSingleIdReflectionProperty()``
- - ``getIdentifierValues($entity)``
- - ``setIdentifierValues($entity, $id)``
- - ``setFieldValue($entity, $field, $value)``
- - ``getFieldValue($entity, $field)``
|