3 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
15 * This software consists of voluntary contributions made by many individuals
16 * and is licensed under the MIT license. For more information, see
17 * <http://www.doctrine-project.org>.
20 namespace Doctrine\ORM\Mapping\Builder;
22 use Doctrine\ORM\Mapping\ClassMetadata,
23 Doctrine\ORM\Mapping\ClassMetadataInfo;
26 * Builder Object for ClassMetadata
28 * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
29 * @link www.doctrine-project.com
31 * @author Benjamin Eberlei <kontakt@beberlei.de>
32 * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
34 class ClassMetadataBuilder
37 * @var \Doctrine\ORM\Mapping\ClassMetadataInfo
42 * @param \Doctrine\ORM\Mapping\ClassMetadataInfo $cm
44 public function __construct(ClassMetadataInfo $cm)
50 * @return ClassMetadata
52 public function getClassMetadata()
58 * Mark the class as mapped superclass.
60 * @return ClassMetadataBuilder
62 public function setMappedSuperClass()
64 $this->cm->isMappedSuperclass = true;
70 * Set custom Repository class name
72 * @param string $repositoryClassName
73 * @return ClassMetadataBuilder
75 public function setCustomRepositoryClass($repositoryClassName)
77 $this->cm->setCustomRepositoryClass($repositoryClassName);
83 * Mark class read only
85 * @return ClassMetadataBuilder
87 public function setReadOnly()
89 $this->cm->markReadOnly();
98 * @return ClassMetadataBuilder
100 public function setTable($name)
102 $this->cm->setPrimaryTable(array('name' => $name));
110 * @param array $columns
111 * @param string $name
112 * @return ClassMetadataBuilder
114 public function addIndex(array $columns, $name)
116 if (!isset($this->cm->table['indexes'])) {
117 $this->cm->table['indexes'] = array();
120 $this->cm->table['indexes'][$name] = array('columns' => $columns);
126 * Add Unique Constraint
128 * @param array $columns
129 * @param string $name
130 * @return ClassMetadataBuilder
132 public function addUniqueConstraint(array $columns, $name)
134 if ( ! isset($this->cm->table['uniqueConstraints'])) {
135 $this->cm->table['uniqueConstraints'] = array();
138 $this->cm->table['uniqueConstraints'][$name] = array('columns' => $columns);
146 * @param string $name
147 * @param string $dqlQuery
148 * @return ClassMetadataBuilder
150 public function addNamedQuery($name, $dqlQuery)
152 $this->cm->addNamedQuery(array(
154 'query' => $dqlQuery,
161 * Set class as root of a joined table inheritance hierachy.
163 * @return ClassMetadataBuilder
165 public function setJoinedTableInheritance()
167 $this->cm->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_JOINED);
173 * Set class as root of a single table inheritance hierachy.
175 * @return ClassMetadataBuilder
177 public function setSingleTableInheritance()
179 $this->cm->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_SINGLE_TABLE);
185 * Set the discriminator column details.
187 * @param string $name
188 * @param string $type
190 public function setDiscriminatorColumn($name, $type = 'string', $length = 255)
192 $this->cm->setDiscriminatorColumn(array(
202 * Add a subclass to this inheritance hierachy.
204 * @param string $name
205 * @param string $class
206 * @return ClassMetadataBuilder
208 public function addDiscriminatorMapClass($name, $class)
210 $this->cm->addDiscriminatorMapClass($name, $class);
216 * Set deferred explicit change tracking policy.
218 * @return ClassMetadataBuilder
220 public function setChangeTrackingPolicyDeferredExplicit()
222 $this->cm->setChangeTrackingPolicy(ClassMetadata::CHANGETRACKING_DEFERRED_EXPLICIT);
228 * Set notify change tracking policy.
230 * @return ClassMetadataBuilder
232 public function setChangeTrackingPolicyNotify()
234 $this->cm->setChangeTrackingPolicy(ClassMetadata::CHANGETRACKING_NOTIFY);
240 * Add lifecycle event
242 * @param string $methodName
243 * @param string $event
244 * @return ClassMetadataBuilder
246 public function addLifecycleEvent($methodName, $event)
248 $this->cm->addLifecycleCallback($methodName, $event);
256 * @param string $name
257 * @param string $type
258 * @param array $mapping
260 public function addField($name, $type, array $mapping = array())
262 $mapping['fieldName'] = $name;
263 $mapping['type'] = $type;
265 $this->cm->mapField($mapping);
271 * Create a field builder.
273 * @param string $name
274 * @param string $type
275 * @return FieldBuilder
277 public function createField($name, $type)
279 return new FieldBuilder(
282 'fieldName' => $name,
289 * Add a simple many to one association, optionally with the inversed by field.
291 * @param string $name
292 * @param string $targetEntity
293 * @param string|null $inversedBy
294 * @return ClassMetadataBuilder
296 public function addManyToOne($name, $targetEntity, $inversedBy = null)
298 $builder = $this->createManyToOne($name, $targetEntity);
301 $builder->inversedBy($inversedBy);
304 return $builder->build();
308 * Create a ManyToOne Assocation Builder.
310 * Note: This method does not add the association, you have to call build() on the AssociationBuilder.
312 * @param string $name
313 * @param string $targetEntity
314 * @return AssociationBuilder
316 public function createManyToOne($name, $targetEntity)
318 return new AssociationBuilder(
321 'fieldName' => $name,
322 'targetEntity' => $targetEntity
324 ClassMetadata::MANY_TO_ONE
329 * Create OneToOne Assocation Builder
331 * @param string $name
332 * @param string $targetEntity
333 * @return AssociationBuilder
335 public function createOneToOne($name, $targetEntity)
337 return new AssociationBuilder(
340 'fieldName' => $name,
341 'targetEntity' => $targetEntity
343 ClassMetadata::ONE_TO_ONE
348 * Add simple inverse one-to-one assocation.
350 * @param string $name
351 * @param string $targetEntity
352 * @param string $mappedBy
353 * @return ClassMetadataBuilder
355 public function addInverseOneToOne($name, $targetEntity, $mappedBy)
357 $builder = $this->createOneToOne($name, $targetEntity);
358 $builder->mappedBy($mappedBy);
360 return $builder->build();
364 * Add simple owning one-to-one assocation.
366 * @param string $name
367 * @param string $targetEntity
368 * @param string $inversedBy
369 * @return ClassMetadataBuilder
371 public function addOwningOneToOne($name, $targetEntity, $inversedBy = null)
373 $builder = $this->createOneToOne($name, $targetEntity);
376 $builder->inversedBy($inversedBy);
379 return $builder->build();
383 * Create ManyToMany Assocation Builder
385 * @param string $name
386 * @param string $targetEntity
387 * @return ManyToManyAssociationBuilder
389 public function createManyToMany($name, $targetEntity)
391 return new ManyToManyAssociationBuilder(
394 'fieldName' => $name,
395 'targetEntity' => $targetEntity
397 ClassMetadata::MANY_TO_MANY
402 * Add a simple owning many to many assocation.
404 * @param string $name
405 * @param string $targetEntity
406 * @param string|null $inversedBy
407 * @return ClassMetadataBuilder
409 public function addOwningManyToMany($name, $targetEntity, $inversedBy = null)
411 $builder = $this->createManyToMany($name, $targetEntity);
414 $builder->inversedBy($inversedBy);
417 return $builder->build();
421 * Add a simple inverse many to many assocation.
423 * @param string $name
424 * @param string $targetEntity
425 * @param string $mappedBy
426 * @return ClassMetadataBuilder
428 public function addInverseManyToMany($name, $targetEntity, $mappedBy)
430 $builder = $this->createManyToMany($name, $targetEntity);
431 $builder->mappedBy($mappedBy);
433 return $builder->build();
437 * Create a one to many assocation builder
439 * @param string $name
440 * @param string $targetEntity
441 * @return OneToManyAssociationBuilder
443 public function createOneToMany($name, $targetEntity)
445 return new OneToManyAssociationBuilder(
448 'fieldName' => $name,
449 'targetEntity' => $targetEntity
451 ClassMetadata::ONE_TO_MANY
456 * Add simple OneToMany assocation.
458 * @param string $name
459 * @param string $targetEntity
460 * @param string $mappedBy
461 * @return ClassMetadataBuilder
463 public function addOneToMany($name, $targetEntity, $mappedBy)
465 $builder = $this->createOneToMany($name, $targetEntity);
466 $builder->mappedBy($mappedBy);
468 return $builder->build();