lib/Doctrine/ODM/MongoDB/DocumentManager.php
public function createDBRef($document, array $referenceMapping = null)
    {
        if ( ! is_object($document)) {
            throw new \InvalidArgumentException('Cannot create a DBRef, the document is not an object');
        }

        $class = $this->getClassMetadata(get_class($document));
        $id = $this->unitOfWork->getDocumentIdentifier($document);

        if (!$id) {
            throw new \RuntimeException(
                sprintf('Cannot create a DBRef without an identifier. UnitOfWork::getDocumentIdentifier() did not return an identifier for class %s', $class->name)
            );
        }

        if ( ! empty($referenceMapping['simple'])) {
            return $class->getDatabaseIdentifierValue($id);
        }

        $dbRef = array(
            '$ref' => $class->getCollection(),
            '$id'  => $class->getDatabaseIdentifierValue($id),
            '$db'  => $this->getDocumentDatabase($class->name)->getName(),
        );

        /* If the class has a discriminator (field and value), use it. A child
         * class that is not defined in the discriminator map may only have a
         * discriminator field and no value, so default to the full class name.
         */
        if (isset($class->discriminatorField)) {
            $dbRef[$class->discriminatorField] = isset($class->discriminatorValue)
                ? $class->discriminatorValue
                : $class->name;
        }

        /* Add a discriminator value if the referenced document is not mapped
         * explicitly to a targetDocument class.
         */
        if ($referenceMapping !== null && ! isset($referenceMapping['targetDocument'])) {
            $discriminatorField = $referenceMapping['discriminatorField'];
            $discriminatorValue = isset($referenceMapping['discriminatorMap'])
                ? array_search($class->name, $referenceMapping['discriminatorMap'])
                : $class->name;

            /* If the discriminator value was not found in the map, use the full
             * class name. In the future, it may be preferable to throw an
             * exception here (perhaps based on some strictness option).
             *
             * @see PersistenceBuilder::prepareEmbeddedDocumentValue()
             */
            if ($discriminatorValue === false) {
                $discriminatorValue = $class->name;
            }

            $dbRef[$discriminatorField] = $discriminatorValue;
        }

        return $dbRef;
    }
public function createDBRef($document, array $referenceMapping = null)
    {
        if ( ! is_object($document)) {
            throw new \InvalidArgumentException('Cannot create a DBRef, the document is not an object');
        }

        $class = $this->getClassMetadata(get_class($document));
        $id = $this->unitOfWork->getDocumentIdentifier($document);

        if (!$id) {
            throw new \RuntimeException(
                sprintf('Cannot create a DBRef without an identifier. UnitOfWork::getDocumentIdentifier() did not return an identifier for class %s', $class->name)
            );
        }

        if ( ! empty($referenceMapping['simple'])) {
            return $class->getDatabaseIdentifierValue($id);
        }

        $dbRef = array(
            '$ref' => $class->getCollection(),
            '$id'  => $class->getDatabaseIdentifierValue($id),
            '$db'  => $this->getDocumentDatabase($class->name)->getName(),
        );

        /* If the class has a discriminator (field and value), use it. A child
         * class that is not defined in the discriminator map may only have a
         * discriminator field and no value, so default to the full class name.
         */
        if (isset($class->discriminatorField)) {
            $dbRef[$class->discriminatorField] = isset($class->discriminatorValue)
                ? $class->discriminatorValue
                : $class->name;
        }

        /* Add a discriminator value if the referenced document is not mapped
         * explicitly to a targetDocument class.
         */
        if ($referenceMapping !== null && ! isset($referenceMapping['targetDocument'])) {
            $discriminatorField = $referenceMapping['discriminatorField'];
            $discriminatorValue = isset($referenceMapping['discriminatorMap'])
                ? array_search($class->name, $referenceMapping['discriminatorMap'])
                : $class->name;

            /* If the discriminator value was not found in the map, use the full
             * class name. In the future, it may be preferable to throw an
             * exception here (perhaps based on some strictness option).
             *
             * @see PersistenceBuilder::prepareEmbeddedDocumentValue()
             */
            if ($discriminatorValue === false) {
                $discriminatorValue = $class->name;
            }

            $dbRef[$discriminatorField] = $discriminatorValue;
        }

        return $dbRef;
    }
public function createDBRef ( $ document , array $ referenceMapping = null ) { if ( ! is_object ( $ document ) ) { throw new \ InvalidArgumentException ( 'Cannot create a DBRef, the document is not an object' ) ; } $ class = $ this -> getClassMetadata ( get_class ( $ document ) ) ; $ id = $ this -> unitOfWork -> getDocumentIdentifier ( $ document ) ; if ( ! $ id ) { throw new \ RuntimeException ( sprintf ( 'Cannot create a DBRef without an identifier. UnitOfWork::getDocumentIdentifier() did not return an identifier for class %s' , $ class -> name ) ) ; } if ( ! empty ( $ referenceMapping [ 'simple' ] ) ) { return $ class -> getDatabaseIdentifierValue ( $ id ) ; } $ dbRef = array ( '$ref' => $ class -> getCollection ( ) , '$id' => $ class -> getDatabaseIdentifierValue ( $ id ) , '$db' => $ this -> getDocumentDatabase ( $ class -> name ) -> getName ( ) , ) ; /* If the class has a discriminator (field and value), use it. A child
         * class that is not defined in the discriminator map may only have a
         * discriminator field and no value, so default to the full class name.
         */ if ( isset ( $ class -> discriminatorField ) ) { $ dbRef [ $ class -> discriminatorField ] = isset ( $ class -> discriminatorValue ) ? $ class -> discriminatorValue : $ class -> name ; } /* Add a discriminator value if the referenced document is not mapped
         * explicitly to a targetDocument class.
         */ if ( $ referenceMapping !== null && ! isset ( $ referenceMapping [ 'targetDocument' ] ) ) { $ discriminatorField = $ referenceMapping [ 'discriminatorField' ] ; $ discriminatorValue = isset ( $ referenceMapping [ 'discriminatorMap' ] ) ? array_search ( $ class -> name , $ referenceMapping [ 'discriminatorMap' ] ) : $ class -> name ; /* If the discriminator value was not found in the map, use the full
             * class name. In the future, it may be preferable to throw an
             * exception here (perhaps based on some strictness option).
             *
             * @see PersistenceBuilder::prepareEmbeddedDocumentValue()
             */ if ( $ discriminatorValue === false ) { $ discriminatorValue = $ class -> name ; } $ dbRef [ $ discriminatorField ] = $ discriminatorValue ; } return $ dbRef ; }
Returns a DBRef array for the supplied document.

@param mixed $document A document object
@param array $referenceMapping Mapping for the field that references the document

@throws \InvalidArgumentException
@return array A DBRef array
Returns a DBRef array for the supplied document .