Doctrine\ODM\CouchDB\Mapping\ClassMetadata::deriveChildMetadata PHP Method

deriveChildMetadata() public method

Used to derive a class metadata of the current instance for a mapped child class.
public deriveChildMetadata ( ClassMetadata $child )
$child ClassMetadata
    public function deriveChildMetadata($child)
    {
        if (!is_subclass_of($child->name, $this->name)) {
            throw new \InvalidArgumentException("Only child class names of '" . $this->name . "' are valid values.");
        }
        $child->isMappedSuperclass = false;
        $child->isEmbeddedDocument = false;
        foreach ($this->fieldMappings as $fieldName => $fieldMapping) {
            $child->fieldMappings[$fieldName] = $fieldMapping;
            if (!isset($fieldMapping['declared'])) {
                $child->fieldMappings[$fieldName]['declared'] = $this->name;
            }
        }
        foreach ($this->associationsMappings as $assocName => $assocMapping) {
            $child->associationsMappings[$assocName] = $assocMapping;
            if (!isset($assocMapping['declared'])) {
                $child->associationsMappings[$assocName]['declared'] = $this->name;
            }
        }
        if ($this->attachmentField) {
            $child->attachmentField = $this->attachmentField;
            if (!$child->attachmentDeclaredClass) {
                $child->attachmentDeclaredClass = $this->name;
            }
        }
    }

Usage Example

コード例 #1
0
 public function testDeriveChildMetadata()
 {
     $cm = new ClassMetadata("Doctrine\\Tests\\ODM\\CouchDB\\Mapping\\Person");
     $cm->mapField(array('fieldName' => 'id', 'id' => true));
     $cm->mapField(array('fieldName' => 'username', 'type' => 'string'));
     $cm->mapAttachments('attachments');
     $cm->mapManyToOne(array('targetDocument' => 'Address', 'fieldName' => 'address'));
     $child = new ClassMetadata('Doctrine\\Tests\\ODM\\CouchDB\\Mapping\\Employee');
     $cm->deriveChildMetadata($child);
     $child->mapField(array('fieldName' => 'status', 'type' => 'string'));
     $this->assertFalse(isset($child->fieldMappings['status']['declared']));
     $this->assertEquals("Doctrine\\Tests\\ODM\\CouchDB\\Mapping\\Employee", $child->name);
     $this->assertTrue(isset($child->fieldMappings['id']), "id field has to be on child metadata");
     $this->assertEquals("Doctrine\\Tests\\ODM\\CouchDB\\Mapping\\Person", $child->fieldMappings['id']['declared']);
     $this->assertTrue(isset($child->fieldMappings['username']), "Username field has to be on child metadata");
     $this->assertEquals("Doctrine\\Tests\\ODM\\CouchDB\\Mapping\\Person", $child->fieldMappings['username']['declared']);
     $this->assertTrue(isset($child->associationsMappings['address']), "address association has to be on child metadata");
     $this->assertEquals("Doctrine\\Tests\\ODM\\CouchDB\\Mapping\\Person", $child->associationsMappings['address']['declared']);
     $this->assertEquals("attachments", $child->attachmentField);
     $this->assertEquals("Doctrine\\Tests\\ODM\\CouchDB\\Mapping\\Person", $child->attachmentDeclaredClass);
     return $child;
 }