informatica:programacion:php:frameworks:laravel:relaciones_entre_modelos
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| informatica:programacion:php:frameworks:laravel:relaciones_entre_modelos [2023/06/15 16:16] – [Relaciones uno a muchos] tempwin | informatica:programacion:php:frameworks:laravel:relaciones_entre_modelos [2025/03/11 16:28] (actual) – [Relaciones polimórficas uno a muchos] tempwin | ||
|---|---|---|---|
| Línea 115: | Línea 115: | ||
| <WRAP center round info 60%> | <WRAP center round info 60%> | ||
| - | Si hubiéramos puesto los paréntesis en '' | + | Si hubiéramos puesto los paréntesis en '' |
| </ | </ | ||
| Línea 351: | Línea 351: | ||
| } | } | ||
| } | } | ||
| + | </ | ||
| + | |||
| + | Para terminar, el modelo Producto: | ||
| + | |||
| + | <code php> | ||
| + | // code | ||
| + | |||
| + | class Product extends Model | ||
| + | { | ||
| + | protected $fillable = [ | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ]; | ||
| + | | ||
| + | public function carts() { | ||
| + | return $this-> | ||
| + | } | ||
| + | | ||
| + | public function orders() { | ||
| + | return $this-> | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Ya estaríamos listos para ejecutar las migraciones: | ||
| + | |||
| + | < | ||
| + | php artisan migrate: | ||
| + | </ | ||
| + | |||
| + | Podemos ahora hacer pruebas con: | ||
| + | |||
| + | < | ||
| + | php artisan tinker | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | $user = App\Models\User:: | ||
| + | |||
| + | $order = App\Models\Order:: | ||
| + | |||
| + | $cart = App\Models\Cart:: | ||
| + | |||
| + | $product = App\Models\Product:: | ||
| + | </ | ||
| + | |||
| + | Ahora para relacionar: | ||
| + | |||
| + | < | ||
| + | $order-> | ||
| + | |||
| + | $order = $order-> | ||
| + | </ | ||
| + | |||
| + | Acceder a los productos: | ||
| + | |||
| + | < | ||
| + | $order-> | ||
| + | </ | ||
| + | |||
| + | ===== Relaciones a través de relaciones ===== | ||
| + | |||
| + | Si miramos nuestro modelo de datos, pagos, órdenes y usuarios están relacionados. A través de la orden, podemos ver que un usuario tiene varios pagos. Esto solo será posible si el pago tiene una clave foránea de la instancia que usaremos como intermediario. En este caso es " | ||
| + | |||
| + | Modelo de usuario ('' | ||
| + | |||
| + | <code php> | ||
| + | // code | ||
| + | |||
| + | public function payments() | ||
| + | { | ||
| + | // Indicamos que queremos llegar al pago a través de la orden | ||
| + | // Entre orden y usuario hay una clave foránea ' | ||
| + | return $this-> | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Esta función nos permite que desde una instanacia de User podamos acceder a su lista de pagos. | ||
| + | |||
| + | Lo podemos ver en funcionamiento: | ||
| + | |||
| + | < | ||
| + | php artisan tinker | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | $user = App\Models\User:: | ||
| + | |||
| + | $order = $user-> | ||
| + | |||
| + | $user-> | ||
| + | |||
| + | $payment = $order-> | ||
| + | |||
| + | $user-> | ||
| + | </ | ||
| + | |||
| + | ===== Relaciones polimórficas uno a uno ===== | ||
| + | |||
| + | Una imagen puede pertenecer a un producto o a un usuario. | ||
| + | |||
| + | En la migración de las imágenes: | ||
| + | |||
| + | <code php> | ||
| + | // code | ||
| + | public function up() | ||
| + | { | ||
| + | Schema:: | ||
| + | $table-> | ||
| + | $table-> | ||
| + | $table-> | ||
| + | // Nuevo: | ||
| + | $table-> | ||
| + | }); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | '' | ||
| + | |||
| + | Iremos a los modelos involucrados, | ||
| + | |||
| + | <code php> | ||
| + | // code | ||
| + | class User extends Authenticatable | ||
| + | { | ||
| + | // code | ||
| + | public function image() | ||
| + | { | ||
| + | return $this-> | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code php> | ||
| + | // code | ||
| + | class Image extends Authenticatable | ||
| + | { | ||
| + | // code | ||
| + | | ||
| + | // El nombre del método lo ponemos como el del parámetro que | ||
| + | // le pasamos a ' | ||
| + | // la migración. | ||
| + | public function imageable() | ||
| + | { | ||
| + | return $this-> | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Relaciones polimórficas uno a muchos ===== | ||
| + | |||
| + | Relación entre '' | ||
| + | |||
| + | Con la migración vista en la sección anterior de la tabla de imágenes (donde añadimos '' | ||
| + | |||
| + | <code php> | ||
| + | // code | ||
| + | public function images() | ||
| + | { | ||
| + | return $this-> | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Relaciones polimórficas muchos a muchos ===== | ||
| + | |||
| + | Migración (se simplifican las migraciones de Producto y Orden): | ||
| + | |||
| + | <code php> | ||
| + | class CreateProductablesTable extends Migration | ||
| + | { | ||
| + | |||
| + | public function up() | ||
| + | { | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | | ||
| + | }); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Ahora vamos al modelo de producto porque puede pertenecer a varios carritos y a varias órdenes: | ||
| + | |||
| + | <code php> | ||
| + | // code | ||
| + | public function carts() | ||
| + | { | ||
| + | return $this-> | ||
| + | } | ||
| + | | ||
| + | // code | ||
| + | public function orders() | ||
| + | { | ||
| + | return $this-> | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Ahora vamos al modelo de la orden: | ||
| + | |||
| + | <code php> | ||
| + | // code | ||
| + | public function products() | ||
| + | { | ||
| + | return $this-> | ||
| + | } | ||
| + | | ||
| + | </ | ||
| + | |||
| + | En el modelo de Cart: | ||
| + | |||
| + | <code php> | ||
| + | // code | ||
| + | public function products() | ||
| + | { | ||
| + | return $this-> | ||
| + | } | ||
| </ | </ | ||
informatica/programacion/php/frameworks/laravel/relaciones_entre_modelos.1686838585.txt.gz · Última modificación: por tempwin
