89 lines
2.4 KiB
ReStructuredText
89 lines
2.4 KiB
ReStructuredText
|
Override Mappings With Annotations
|
||
|
----------------------------------
|
||
|
|
||
|
Sometimes there is a need to persist entities but override all or part of the
|
||
|
mapping metadata. Sometimes also the mapping to override comes from entities
|
||
|
using traits where the traits have mapping metadata.
|
||
|
This tutorial explains how to override mapping metadata,
|
||
|
i.e. attributes and associations metadata in particular. The example here shows
|
||
|
the overriding of a class that uses a trait but is similar when extending a base
|
||
|
class as shown at the end of this tutorial.
|
||
|
|
||
|
Suppose we have a class ExampleEntityWithOverride. This class uses trait ExampleTrait:
|
||
|
|
||
|
.. code-block:: php
|
||
|
|
||
|
<?php
|
||
|
/**
|
||
|
* @Entity
|
||
|
*
|
||
|
* @AttributeOverrides({
|
||
|
* @AttributeOverride(name="foo",
|
||
|
* column=@Column(
|
||
|
* name = "foo_overridden",
|
||
|
* type = "integer",
|
||
|
* length = 140,
|
||
|
* nullable = false,
|
||
|
* unique = false
|
||
|
* )
|
||
|
* )
|
||
|
* })
|
||
|
*
|
||
|
* @AssociationOverrides({
|
||
|
* @AssociationOverride(name="bar",
|
||
|
* joinColumns=@JoinColumn(
|
||
|
* name="example_entity_overridden_bar_id", referencedColumnName="id"
|
||
|
* )
|
||
|
* )
|
||
|
* })
|
||
|
*/
|
||
|
class ExampleEntityWithOverride
|
||
|
{
|
||
|
use ExampleTrait;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @Entity
|
||
|
*/
|
||
|
class Bar
|
||
|
{
|
||
|
/** @Id @Column(type="string") */
|
||
|
private $id;
|
||
|
}
|
||
|
|
||
|
The docblock is showing metadata override of the attribute and association type. It
|
||
|
basically changes the names of the columns mapped for a property ``foo`` and for
|
||
|
the association ``bar`` which relates to Bar class shown above. Here is the trait
|
||
|
which has mapping metadata that is overridden by the annotation above:
|
||
|
|
||
|
.. code-block:: php
|
||
|
|
||
|
/**
|
||
|
* Trait class
|
||
|
*/
|
||
|
trait ExampleTrait
|
||
|
{
|
||
|
/** @Id @Column(type="string") */
|
||
|
private $id;
|
||
|
|
||
|
/**
|
||
|
* @Column(name="trait_foo", type="integer", length=100, nullable=true, unique=true)
|
||
|
*/
|
||
|
protected $foo;
|
||
|
|
||
|
/**
|
||
|
* @OneToOne(targetEntity="Bar", cascade={"persist", "merge"})
|
||
|
* @JoinColumn(name="example_trait_bar_id", referencedColumnName="id")
|
||
|
*/
|
||
|
protected $bar;
|
||
|
}
|
||
|
|
||
|
The case for just extending a class would be just the same but:
|
||
|
|
||
|
.. code-block:: php
|
||
|
|
||
|
class ExampleEntityWithOverride extends BaseEntityWithSomeMapping
|
||
|
{
|
||
|
// ...
|
||
|
}
|