Diferencia entre revisiones de «Asociaciones»
(No se muestran 12 ediciones intermedias de 6 usuarios) | |||
Línea 1: | Línea 1: | ||
− | = | + | =Introducción= |
Muchas aplicaciones trabajan con múltiples tablas en una base de datos y normalmente hay relaciones entre esas tablas. Por ejemplo, una ciudad puede ser el hogar de muchos clientes pero un cliente solo tiene una ciudad. En un esquema de base de datos, estas relaciones son enlazadas mediante el uso de llaves primarias y foráneas. | Muchas aplicaciones trabajan con múltiples tablas en una base de datos y normalmente hay relaciones entre esas tablas. Por ejemplo, una ciudad puede ser el hogar de muchos clientes pero un cliente solo tiene una ciudad. En un esquema de base de datos, estas relaciones son enlazadas mediante el uso de llaves primarias y foráneas. | ||
Línea 8: | Línea 8: | ||
<source lang=php> | <source lang=php> | ||
− | + | $ciudad_id = $cliente->ciudad_id; | |
− | + | $ciudad = $Ciudad->find($ciudad_id); | |
− | + | echo $ciudad->nombre; | |
</source> | </source> | ||
Línea 16: | Línea 16: | ||
<source lang=php> | <source lang=php> | ||
− | + | echo $cliente->getCiudad()->nombre; | |
</source> | </source> | ||
− | Gran parte de la magia que tiene ActiveRecord es esto, ya que convierte las llaves foráneas en sentencias de alto nivel, fáciles de comprender y de trabajar. | + | Gran parte de la magia que tiene ActiveRecord es esto, ya que convierte las llaves foráneas en sentencias de alto nivel, fáciles de comprender y de trabajar. |
=Pertenece (belongs_to)= | =Pertenece (belongs_to)= | ||
Línea 38: | Línea 38: | ||
<source lang=php> | <source lang=php> | ||
− | + | $this->belongs_to('persona'); | |
− | + | $this->belongs_to('vendedor', 'model: Persona') | |
− | + | $this->belongs_to('funcionario', 'model: Persona', 'fk: persona_id') | |
</source> | </source> | ||
Línea 46: | Línea 46: | ||
<source lang=php> | <source lang=php> | ||
− | + | class Libro extends ActiveRecord { | |
− | + | public function initialize() { | |
− | + | $this->belongs_to('persona'); | |
− | + | } | |
− | + | } | |
</source> | </source> | ||
− | = | + | =Tiene un (has_one)= |
Este tipo de relación se efectúa con el método “has_one”, en esta la llave foránea se encuentra en la tabla del modelo con el que se quiere asociar. Corresponde a una relación uno a uno en el modelo entidad relación. | Este tipo de relación se efectúa con el método “has_one”, en esta la llave foránea se encuentra en la tabla del modelo con el que se quiere asociar. Corresponde a una relación uno a uno en el modelo entidad relación. | ||
Línea 67: | Línea 67: | ||
fk: nombre de la llave foránea mediante la cual se relaciona. Por defecto se considera el nombre de la relación con el sufijo “_id”. Ejemplo: Si $relation='auto_volador', entonces fk=auto_volador_id. | fk: nombre de la llave foránea mediante la cual se relaciona. Por defecto se considera el nombre de la relación con el sufijo “_id”. Ejemplo: Si $relation='auto_volador', entonces fk=auto_volador_id. | ||
− | Ejemplos de uso: | + | '''Ejemplos de uso:''' |
<source lang=php> | <source lang=php> | ||
− | + | $this->has_one('persona'); | |
− | + | $this->has_one('vendedor', 'model: Persona') | |
− | + | $this->has_one('funcionario', 'model: Persona', 'fk: personal_id') | |
</source> | </source> | ||
Línea 78: | Línea 78: | ||
<source lang=php> | <source lang=php> | ||
− | + | class Persona extends ActiveRecord { | |
− | + | public function initialize() { | |
− | + | $this->has_one('datos_personales'); | |
− | + | } | |
− | + | } | |
</source> | </source> | ||
Línea 93: | Línea 93: | ||
$relation (string): nombre de la relación. | $relation (string): nombre de la relación. | ||
− | Parámetros con nombre: | + | '''Parámetros con nombre:''' |
model: Nombre del tipo de modelo que debe retornar la consulta de la relación. Por defecto se considera un modelo que corresponda al nombre de la relación. Ejemplo: Si $relation='auto_volador', entonces model=AutoVolador | model: Nombre del tipo de modelo que debe retornar la consulta de la relación. Por defecto se considera un modelo que corresponda al nombre de la relación. Ejemplo: Si $relation='auto_volador', entonces model=AutoVolador | ||
Línea 99: | Línea 99: | ||
fk: nombre de la llave foránea mediante la cual se relaciona. Por defecto se considera el nombre de la relación con el sufijo “_id”. Ejemplo: Si $relation='auto_volador', entonces fk=auto_volador_id. | fk: nombre de la llave foránea mediante la cual se relaciona. Por defecto se considera el nombre de la relación con el sufijo “_id”. Ejemplo: Si $relation='auto_volador', entonces fk=auto_volador_id. | ||
− | Ejemplos de uso: | + | '''Ejemplos de uso:''' |
<source lang=php> | <source lang=php> | ||
− | + | $this->has_many('persona'); | |
− | + | $this->has_many('vendedor', 'model: Persona') | |
− | + | $this->has_many('funcionario', 'model: Persona', 'fk: personal_id') | |
</source> | </source> | ||
Línea 110: | Línea 110: | ||
<source lang=php> | <source lang=php> | ||
− | + | class Persona extends ActiveRecord { | |
− | + | public function initialize() { | |
− | + | $this->has_many('libro'); | |
− | + | } | |
− | + | } | |
</source> | </source> | ||
Línea 125: | Línea 125: | ||
$relation (string): nombre de la relación. | $relation (string): nombre de la relación. | ||
− | Parámetros con nombre: | + | '''Parámetros con nombre:''' |
model: Nombre del tipo de modelo que debe retornar la consulta de la relación. Por defecto se considera un modelo que corresponda al nombre de la relación. Ejemplo: Si $relation='auto_volador', entonces model=AutoVolador | model: Nombre del tipo de modelo que debe retornar la consulta de la relación. Por defecto se considera un modelo que corresponda al nombre de la relación. Ejemplo: Si $relation='auto_volador', entonces model=AutoVolador | ||
Línea 135: | Línea 135: | ||
through: tabla a través de la cual se establece la relación muchos a muchos. Por defecto se forma por el nombre de la tabla del modelo que tiene el nombre de tabla mas largo y como prefijo un “_” y el nombre de la tabla del otro modelo. | through: tabla a través de la cual se establece la relación muchos a muchos. Por defecto se forma por el nombre de la tabla del modelo que tiene el nombre de tabla mas largo y como prefijo un “_” y el nombre de la tabla del otro modelo. | ||
− | Ejemplos de uso: | + | '''Ejemplos de uso:''' |
+ | |||
+ | <source lang=php> | ||
+ | $this->has_and_belongs_to_many('persona'); | ||
+ | $this->has_and_belongs_to_many('cargos', 'model: Cargo', 'fk: id_cargo', 'key: id_persona', 'through: cargo_persona'); | ||
+ | </source> | ||
− | |||
− | |||
− | En el modelo Persona: | + | '''En el modelo Persona:''' |
<source lang=php> | <source lang=php> | ||
− | + | class Persona extends ActiveRecord { | |
− | + | public function initialize() { | |
− | + | $this->has_and_belongs_to_many('cargo'); | |
− | + | } | |
− | + | } | |
</source> | </source> |
Revisión actual del 07:41 7 jul 2016
Sumario
Introducción[editar]
Muchas aplicaciones trabajan con múltiples tablas en una base de datos y normalmente hay relaciones entre esas tablas. Por ejemplo, una ciudad puede ser el hogar de muchos clientes pero un cliente solo tiene una ciudad. En un esquema de base de datos, estas relaciones son enlazadas mediante el uso de llaves primarias y foráneas.
Como ActiveRecord trabaja con la convención: La llave foránea tiene el nombre de la tabla y termina en id, así: ciudad_id, esto es una relación a la tabla ciudad a su llave primaria id.
Así que, sabiendo esto, quisiéramos que en vez de decir:
$ciudad_id = $cliente->ciudad_id;
$ciudad = $Ciudad->find($ciudad_id);
echo $ciudad->nombre;
mejor fuera:
echo $cliente->getCiudad()->nombre;
Gran parte de la magia que tiene ActiveRecord es esto, ya que convierte las llaves foráneas en sentencias de alto nivel, fáciles de comprender y de trabajar.
Pertenece (belongs_to)[editar]
Este tipo de relación se efectúa con el método “belongs_to”, en esta la llave foránea se encuentra en la tabla del modelo de donde se invoca el método. Corresponde a una relación uno a uno en el modelo entidad relación.
belongs_to($relation)
$relation (string): nombre de la relación.
Parámetros con nombre:
model: Nombre del tipo de modelo que debe retornar la consulta de la relación. Por defecto se considera un modelo que corresponda al nombre de la relación. Ejemplo: Si $relation='auto_volador', entonces model=AutoVolador
fk: nombre de la llave foránea mediante la cual se relaciona. Por defecto se considera el nombre de la relación con el sufijo “_id”. Ejemplo: Si $relation='auto_volador', entonces fk=auto_volador_id.
Ejemplos de uso:
$this->belongs_to('persona');
$this->belongs_to('vendedor', 'model: Persona')
$this->belongs_to('funcionario', 'model: Persona', 'fk: persona_id')
En el modelo Libro:
class Libro extends ActiveRecord {
public function initialize() {
$this->belongs_to('persona');
}
}
Tiene un (has_one)[editar]
Este tipo de relación se efectúa con el método “has_one”, en esta la llave foránea se encuentra en la tabla del modelo con el que se quiere asociar. Corresponde a una relación uno a uno en el modelo entidad relación.
has_one($relation)
$relation (string): nombre de la relación.
Parámetros con nombre:
model: Nombre del tipo de modelo que debe retornar la consulta de la relación. Por defecto se considera un modelo que corresponda al nombre de la relación. Ejemplo: Si $relation='auto_volador', entonces model=AutoVolador
fk: nombre de la llave foránea mediante la cual se relaciona. Por defecto se considera el nombre de la relación con el sufijo “_id”. Ejemplo: Si $relation='auto_volador', entonces fk=auto_volador_id.
Ejemplos de uso:
$this->has_one('persona');
$this->has_one('vendedor', 'model: Persona')
$this->has_one('funcionario', 'model: Persona', 'fk: personal_id')
En el modelo Persona:
class Persona extends ActiveRecord {
public function initialize() {
$this->has_one('datos_personales');
}
}
Tiene muchos (has_many)[editar]
Este tipo de relación se efectúa con el método “has_many”, en esta la llave foránea se encuentra en la tabla del modelo con el que se quiere asociar. Corresponde a una relación uno a muchos en el modelo entidad relación.
has_many($relation)
$relation (string): nombre de la relación.
Parámetros con nombre:
model: Nombre del tipo de modelo que debe retornar la consulta de la relación. Por defecto se considera un modelo que corresponda al nombre de la relación. Ejemplo: Si $relation='auto_volador', entonces model=AutoVolador
fk: nombre de la llave foránea mediante la cual se relaciona. Por defecto se considera el nombre de la relación con el sufijo “_id”. Ejemplo: Si $relation='auto_volador', entonces fk=auto_volador_id.
Ejemplos de uso:
$this->has_many('persona');
$this->has_many('vendedor', 'model: Persona')
$this->has_many('funcionario', 'model: Persona', 'fk: personal_id')
En el modelo Persona:
class Persona extends ActiveRecord {
public function initialize() {
$this->has_many('libro');
}
}
Tiene y pertenece a muchos (has_and_belongs_to_many)[editar]
Este tipo de relación se efectúa con el método “has_and_belongs_to_many”, esta se efectúa a través de una tabla que se encarga de enlazar los dos modelos. Corresponde a una relación muchos a muchos en el modelo entidad relación. Este tipo de relación tiene la desventaja de que no es soportada en el ámbito de múltiples conexiones de ActiveRecord, para lograr que funcione con multiples conexiones, se puede emular a través de dos relaciones has_many al modelo de la tabla que relaciona.
has_and_belongs_to_many($relation)
$relation (string): nombre de la relación.
Parámetros con nombre:
model: Nombre del tipo de modelo que debe retornar la consulta de la relación. Por defecto se considera un modelo que corresponda al nombre de la relación. Ejemplo: Si $relation='auto_volador', entonces model=AutoVolador
fk: nombre de la llave foránea mediante la cual se relaciona. Por defecto se considera el nombre de la relación con el sufijo “_id”. Ejemplo: Si $relation='auto_volador', entonces fk=auto_volador_id.
key: nombre del campo que contendrá el valor de la llave primaria en la tabla intermedia que contendrá los campos de la relación. Por defecto corresponde al nombre del modelo con que se va a relacionar con el sufijo “_id”.
through: tabla a través de la cual se establece la relación muchos a muchos. Por defecto se forma por el nombre de la tabla del modelo que tiene el nombre de tabla mas largo y como prefijo un “_” y el nombre de la tabla del otro modelo.
Ejemplos de uso:
$this->has_and_belongs_to_many('persona');
$this->has_and_belongs_to_many('cargos', 'model: Cargo', 'fk: id_cargo', 'key: id_persona', 'through: cargo_persona');
En el modelo Persona:
class Persona extends ActiveRecord {
public function initialize() {
$this->has_and_belongs_to_many('cargo');
}
}