No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Relaciones con eloquent

20/25
Recursos
  • Si estamos hablando de un blogpost, es posible que éste esté relacionado con múltiples comentarios y a su vez con un solo creador. Existen muchas maneras para relacionar bases de datos y esto nos ayudará a tener una integridad y una referencia hacia lo que necesitamos.
  • -m o –migration son exactamente lo mismo y se pueden usar indistintamente.
  • Haremos una relación de muchos a uno, es decir que un reporte puede tener muchos detalles.
  • PHP en sus últimas versiones nos ofrece que todas las clases contienen la propiedad estática que es el nombre de la clase y la regresa directamente.

Aportes 23

Preguntas 11

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Contamos con más relaciones:

1 a 1 —> $this->hasOne(‘App\Model’);
1 a M —> $this->hasMany(‘App\Model’);
M a 1 —> $this->belongsToMany(‘App\Model’);
M a M —> $this->belongsToMany(‘App\Model’);

Es importante resaltar que si mi tabla tiene un código de id que rompe la convención las podemos resaltar de la siguiente forma
$this->hasMany(‘App\Model’, ‘key_principal’, ‘key_referencia’);

También pueden revisar la documentación
https://laravel.com/docs/5.8/eloquent-relationships

Como buena práctica al tratarse de base de datos, además de crear el campo referenciado “expense_report_id” se debe crear la llave foránea, esto se encuentra especificado en la Documentación oficial de Laravel. Para el caso del ejemplo sería agregar la siguiente línea:

    $table->foreign('expense_report_id')->references('id')->on('expense_reports');

Gente, favor revisar. Clase fundamental en relaciones en eloquent pero no se ve nada del código mientras se explica.

Minuto 12:45 tips importante para el tema de las relaciones en la base de datos, creo q lo informa asi como de pason, pero creeria q debio haber hecho mas enfasis sobre ese detalle el cual es muy importante.

Creo que se pudo explicar mejor, eloquent tiene diferentes formas de hacer lo mismo

me perdi con la magia :S

Buenos despues de cacharear en un proyecto personal, al momento de intentar la relacion hasMany no me daba resultados, claro especifico era lo hacia en un proyecto personal, con tablas diferentes. Los errores q me salian era por los diferentes motivos.

  1. El nombre del campo id, Laravel pide q debe tener ese nombre “id”.
  2. El campo a relacionar debe ser nombre_table_id, para q Laravel internamente pueda hacer la relacion.

Les recomiendo leer este link a la documentacion donde explicar como crear las tablas.

https://laravel.com/docs/5.8/migrations#creating-tables.

Como recomendación para el que esta viendo el curso hoy que ya estamos en la version 7x de Laravel es que vean la documentación oficial y sigan las convenciones.

Usen el video como apoyo para entender lo que esta pasando.

Las tablas se deben de relacionar y la forma de hacerlo es con el comando:

$table->foreign('expense_report_id')->references('id')->on('expense_reports');

El método completo para hacer la migración queda así:

    public function up()
    {
        Schema::create('expenses', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('expense_report_id');
            $table->text('description');
            $table->decimal('amount');
            $table->timestamps();
            
            $table->foreign('expense_report_id')->references('id')->on('expense_reports');
        });
    }

Si llegan a tener algún error, es probable que los dos campos que se van a relacionar no tengan el mismo tipo de dato.

Excelente las relaciones como se hacen en los modelos de PHP para obtener sus datos

Por alguna razón no se porque me aparece como Null

App\Expense::first();
=> App\Expense {#3000
id: 1,
expense_report_id: 3,
description: “Transporte”,
amount: “100.00”,
created_at: null,
updated_at: null,
}

App\Expense::first()->expenseReport;
=> null

App\Expense::first()->expenseReport;
=> null

Alguien sabe porque pasa eso

  • ¿Eloquent no relaciona en sí las tablas en la base de datos, solo lo relaciona desde el sistema?

  • ¿Cómo se haría para crear migraciones donde las tablas se relacionen en la misma base de datos?

Apuntes:
Al trabajar con bases de datos, normalmente establecemos relaciones, lo que proporciona integridad y nos permite llamar a referencias entre entidades.
Para establecer una entidad en una base de datos, escribimos en la consola 'php artisan make:model -help’
Dentro de las opciones que nos ofrece el comando, esta el de crear una nueva migracion al momento (-m es lo mismo que --migration), para ello escribimos:

  • php artisan make:model -m 'NombreModelo’
    Nuestro modelo aunque lo creemos en singular, laravel se encarga de crear la tabla en plutal.
    Creamos las columnas respectivas y procedemos a hacer la migracion: ‘php artisan migrate’.
    Consecuentemente debemos realizar las relaciones.

en vez de poner $table->unsignedBigInteger(‘user_id’);
podemos escribir en la migracion;
$table->foreign(‘user_id’)->references(‘id’)->on(‘users’);

¿?¿¿??¿¿??

Tengo una pregunta, como hago para q Laravel me muestre los querys q hace a la base de datos???. Osea los querys q hace en general, ya ea para crear relaciones, indices, consultar, etc, etc, etc.

En el caso de las relaciones, cuando se debe usar como una propiedad y cuando como un método?

¿Es posible obtener los datos de ExpenseReport y a la vez obtener también los datos de Expense relacionados?

Excelente

PARA ELIMINAR EL REPORTE, CUANDO TENGA PAGOS

$table->foreign('expense_report_id')->references('id')->on('expense_reports')->onDelete('cascade');

Para quienes les aparezca vacio por solo seguir el código, fijense en el id que les tira el App\ExpenseReport::first(); y en la base de datos donde dice expense_report_id ponen ese id que les dio la tabla.

Relación HasMany

Cuando defines la relación en las migraciones, lo que estás haciendo es crear esa relación en la base de datos para que la misma base de datos tenga conocimiento de ella, pero esto Laravel no lo sabe, es por eso que se necesita definir las relaciones en los modelos también, es ahí donde Laravel sabe qué modelo se relaciona con cual.

Y lo interesante de esto es que ya te trae todo relacionado en forma de listas, y es mucho más cómodo a la hora de trabajar

Cuando hago App\ExpenseReport::first()->expenses; me devuelve el campo, pero si lo hago a la inversa con App\Expense::first()->expenseReport; me devuelve null. Por que sera?