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
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}
1 namespace models;
2
3 class User{
4 /**
5 * @id
6 */
7 private $id;
8
9 private $firstname;
10
11 public function getFirstname(){
12 return $this->firstname;
13 }
14 public function setFirstname($firstname){
15 $this->firstname=$firstname;
16 }
17 }
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.
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}
1namespace models;
2
3/**
4 * @table("name"=>"user")
5 */
6class User{
7 /**
8 * @id
9 */
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.
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}
1namespace models;
2
3/**
4 * @table("user")
5 */
6class User{
7 /**
8 * @id
9 */
10 private $id;
11
12 /**
13 * column("user_name")
14 */
15 private $firstname;
16
17 public function getFirstname(){
18 return $this->firstname;
19 }
20 public function setFirstname($firstname){
21 $this->firstname=$firstname;
22 }
23}
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:
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}
1 namespace models;
2
3 class User{
4 /**
5 * @id
6 */
7 private $id;
8
9 private $firstname;
10
11 /**
12 * @manyToOne
13 * @joinColumn("className"=>"models\\Organization","name"=>"idOrganization","nullable"=>false)
14 */
15 private $organization;
16
17 public function getOrganization(){
18 return $this->organization;
19 }
20
21 public function setOrganization($organization){
22 $this->organization=$organization;
23 }
24}
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:
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}
1namespace models;
2
3class Organization{
4 /**
5 * @id
6 */
7 private $id;
8
9 private $name;
10
11 /**
12 * @oneToMany("mappedBy"=>"organization","className"=>"models\\User")
13 */
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.
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}
1namespace models;
2
3class User{
4 /**
5 * @id
6 */
7 private $id;
8
9 private $firstname;
10
11 /**
12 * @manyToMany("targetEntity"=>"models\\Group","inversedBy"=>"users")
13 * @joinTable("name"=>"groupusers")
14 */
15 private $groups;
16
17}
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}
1namespace models;
2
3class Group{
4 /**
5 * @id
6 */
7 private $id;
8
9 private $name;
10
11 /**
12 * @manyToMany("targetEntity"=>"models\\User","inversedBy"=>"groups")
13 * @joinTable("name"=>"groupusers")
14 */
15 private $users;
16
17}
Si no se respetan las convenciones de nomenclatura para las claves externas, es posible especificar los campos relacionados.
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}
1namespace models;
2
3class Group{
4 /**
5 * @id
6 */
7 private $id;
8
9 private $name;
10
11 /**
12 * @manyToMany("targetEntity"=>"models\\User","inversedBy"=>"groupes")
13 * @joinTable("name"=>"groupeusers",
14 * "joinColumns"=>["name"=>"id_groupe","referencedColumnName"=>"id"],
15 * "inverseJoinColumns"=>["name"=>"id_user","referencedColumnName"=>"id"])
16 */
17 private $users;
18
19}
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 |