No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Curso de PHP con Laravel

Curso de PHP con Laravel

H茅ctor Benitez

H茅ctor Benitez

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 鈥搈igration 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(鈥楢pp\Model鈥);
1 a M 鈥> $this->hasMany(鈥楢pp\Model鈥);
M a 1 鈥> $this->belongsToMany(鈥楢pp\Model鈥);
M a M 鈥> $this->belongsToMany(鈥楢pp\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(鈥楢pp\Model鈥, 鈥榢ey_principal鈥, 鈥榢ey_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 鈥渆xpense_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 鈥渋d鈥.
  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: 鈥淭ransporte鈥,
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: 鈥榩hp artisan migrate鈥.
    Consecuentemente debemos realizar las relaciones.

en vez de poner $table->unsignedBigInteger(鈥榰ser_id鈥);
podemos escribir en la migracion;
$table->foreign(鈥榰ser_id鈥)->references(鈥榠d鈥)->on(鈥榰sers鈥);

驴?驴驴??驴驴??

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?