ORM

Nota

si desea generar automáticamente los modelos, consulte la parte generating models .

Una clase modelo es simplemente un objeto php sin herencia. |br|Los modelos se encuentran por defecto en la carpeta app\models. |br|El mapeo relacional de objetos (ORM) se basa en anotaciones de miembros o atributos (desde PHP8) en la clase modelo.

Definición de modelos

Un modelo básico

  • Un modelo debe definir su clave primaria utilizando la anotación @id en los miembros correspondientes

  • Los miembros serializados deben tener getters y setters

  • Sin ninguna otra anotación, una clase corresponde a una tabla con el mismo nombre en la base de datos, cada miembro corresponde a un campo de esta tabla

app/models/User.php
 1namespace models;
 2
 3use Ubiquity\attributes\items\Id;
 4
 5class User{
 6
 7   #[Id]
 8   private $id;
 9
10   private $firstname;
11
12   public function getFirstname(){
13      return $this->firstname;
14   }
15   public function setFirstname($firstname){
16      $this->firstname=$firstname;
17   }
18}

Mapeo

Table->Class

Si el nombre de la tabla es diferente del nombre de la clase, la anotación @table permite especificar el nombre de la tabla.

app/models/User.php
 1namespace models;
 2
 3use Ubiquity\attributes\items\Table;
 4use Ubiquity\attributes\items\Id;
 5
 6#[Table('user')]
 7class User{
 8
 9   #[Id]
10   private $id;
11
12   private $firstname;
13
14   public function getFirstname(){
15      return $this->firstname;
16   }
17   public function setFirstname($firstname){
18      $this->firstname=$firstname;
19   }
20}

Field->Member

Si el nombre de un campo es diferente del nombre de un miembro de la clase, la anotación @column permite especificar un nombre de campo diferente.

app/models/User.php
 1namespace models;
 2
 3use Ubiquity\attributes\items\Table;
 4use Ubiquity\attributes\items\Id;
 5use Ubiquity\attributes\items\Column;
 6
 7#[Table('user')
 8class User{
 9
10   #[Id]
11   private $id;
12
13   #[Column('column_name')]
14   private $firstname;
15
16   public function getFirstname(){
17      return $this->firstname;
18   }
19   public function setFirstname($firstname){
20      $this->firstname=$firstname;
21   }
22}

Asociaciones

Nota

Convención de nombres
Los nombres de los campos de clave foránea consisten en el nombre de la clave primaria de la tabla referenciada seguido del nombre de la tabla referenciada cuya primera letra es mayúscula. |br|Ejemplo: idUsuario para la tabla usuario cuya clave primaria es id.

ManyToOne

Un usuario pertenece a una organización:

../_images/manyToOne.png
app/models/User.php
 1 namespace models;
 2
 3use Ubiquity\attributes\items\ManyToOne;
 4use Ubiquity\attributes\items\Id;
 5use Ubiquity\attributes\items\JoinColumn;
 6
 7 class User{
 8
 9   #[Id]
10   private $id;
11
12   private $firstname;
13
14   #[ManyToOne]
15   #[JoinColumn(className: \models\Organization::class, name: 'idOrganization', nullable: false)]
16   private $organization;
17
18   public function getOrganization(){
19      return $this->organization;
20   }
21
22   public function setOrganization($organization){
23      $this->organization=$organization;
24   }
25}

La anotación @joinColumn o el atributo JoinColumn especifica que:

  • El miembro $organization es una instancia de modelsOrganization.

  • La tabla user tiene una clave externa idOrganization que hace referencia a la clave primaria de la organización

  • Esta clave externa no es null => un usuario siempre tendrá una organización

OneToMany

Una organización tiene muchos usuarios:

../_images/oneToMany.png
app/models/Organization.php
 1namespace models;
 2
 3use Ubiquity\attributes\items\OneToMany;
 4use Ubiquity\attributes\items\Id;
 5
 6class Organization{
 7
 8   #[Id]
 9   private $id;
10
11   private $name;
12
13   #[OneToMany(mappedBy: 'organization', className: \models\User::class)]
14   private $users;
15}

En este caso, la asociación es bidireccional. |br|La anotación @oneToMany sólo debe especificar:

  • La clase de cada usuario en la matriz de usuarios : modelsUser

  • el valor de @mappedBy es el nombre del atributo association-mapping en el lado propietario: $organization en la clase User.

ManyToMany

  • Un usuario puede pertenecer a grupos.

  • Un grupo está formado por varios usuarios.

../_images/manyToMany.png
app/models/User.php
 1namespace models;
 2
 3use Ubiquity\attributes\items\ManyToMany;
 4use Ubiquity\attributes\items\Id;
 5use Ubiquity\attributes\items\JoinTable;
 6
 7class User{
 8
 9   #[Id]
10   private $id;
11
12   private $firstname;
13
14   #[ManyToMany(targetEntity: \models\Group::class, inversedBy: 'users')]
15   #[JoinTable(name: 'groupusers')]
16   private $groups;
17
18}
app/models/Group.php
 1namespace models;
 2
 3use Ubiquity\attributes\items\ManyToMany;
 4use Ubiquity\attributes\items\Id;
 5use Ubiquity\attributes\items\JoinTable;
 6
 7class Group{
 8
 9   #[Id]
10   private $id;
11
12   private $name;
13
14   #[ManyToMany(targetEntity: \models\User::class, inversedBy: 'groups')]
15   #[JoinTable(name: 'groupusers')]
16   private $users;
17
18}

Si no se respetan las convenciones de nomenclatura para las claves externas, es posible especificar los campos relacionados.

app/models/Group.php
 1namespace models;
 2
 3use Ubiquity\attributes\items\ManyToMany;
 4use Ubiquity\attributes\items\Id;
 5use Ubiquity\attributes\items\JoinTable;
 6
 7class Group{
 8
 9   #[Id]
10   private $id;
11
12   private $name;
13
14   #[ManyToMany(targetEntity: \models\User::class, inversedBy: 'groupes')]
15   #[JoinTable(name: 'groupeusers',
16   joinColumns: ['name'=>'id_groupe','referencedColumnName'=>'id'],
17   inverseJoinColumns: ['name'=>'id_user','referencedColumnName'=>'id'])]
18   private $users;
19
20}

Anotaciones ORM

Anotaciones para las clases

@annotation

rol

propiedades

rol

@database

Define el desplazamiento de la base de datos asociada (definido en el archivo de configuración)

@table

Define el nombre de la tabla asociada.

Anotaciones para los miembros

@annotation

rol

propiedades

rol

@id

Define la(s) clave(s) primaria(s).

@column

Especifique las características del campo asociado.

name

Nombre del campo asociado

nullable

true si el valor puede ser null

dbType

Tipo de campo en la base de datos

@transient

Especifica que el campo no es persistente.

Asociaciones

@annotation (extends)

rol

propiedades [opcional]

rol

@manyToOne

Define una asociación de un solo valor a otra clase de entidad.

@joinColumn (@column)

Indica la clave externa en la asociación manyToOne.

className

Clase del miembro

[referencedColumnName]

Nombre de la columna asociada

@oneToMany

Define una asociación multivaluada (multi-valued) a otra clase de entidad.

className

Clase de los objetos en miembro

[mappedBy]

Nombre del atributo de asignación de asociaciones (association-mapping) en el lado propietario

@manyToMany

Define una asociación multivaluada (many-valued) con multiplicidad de muchos a muchos (many-to-many).

targetEntity

Clase de los objetos en miembro

[inversedBy]

Nombre del miembro de la asociación (association-member) en el lado inverso (inverse-side)

[mappedBy]

Nombre de la asociación miembro ( association-member) de la parte propietaria

@joinTable

Define la tabla de asociación para la multiplicidad muchos a muchos (many-to-many)

name

Nombre de la tabla de asociación

[joinColumns]

@column => nombre y referencedColumnName para este lado

[inverseJoinColumns]

@column => nombre y referencedColumnName para el otro lado