En la tabla Cursos existen dos relaciones que debemos tomar en cuenta considerando nuestro modelo entidad-relación.
Relación uno a muchos
La relación existente entre la tabla profesores y la tabla cursos, es una relación de uno a muchos (o muchos a uno), es decir, un profesor puede dictar muchos cursos o un curso puede ser dictado por un solo profesor.
En la tabla cursos registramos el IDProfesor como llave foránea de la tabla profesores, esto creará una integridad referencial a nivel de la base de datos.
Si no tendríamos la migración haríamos ( en nuestro caso con la instrucción anterior crea el modelo y la migración)
El código de la migración
Vamos a modificar la tabla con los campos que queremos
Quedara
Esto daría error , ya que tenemos que tener la tabla de profesores en las migraciones antes
Vamos hacer la migración de la tabla de profesores, pero no lo vamos hacer a la vez que el modelo, ya que la tabla seria por convención de laravel profesors y no es lo que queremos
su código
y cambiamos datos
Si hacemos ala migración ahora seguirá dando error
Tenemos que cambiar el orden de las migraciones de profesores y cursos
Lo que hacemos cambiando números iniciales por ejemplo
si ahora volvemos hacer
lo hace sin errores y tenemos en la BD
Tenemos
Creamos el modelo Profesor
En este modelo es necesario protected $table = "profesores"; ya que no sigue la convención de laravel
Tabla Pivot
La relación entre la tabla alumnos y cursos es una relación muchos a muchos (Un alumno puede tomar varios cursos, un curso puede tener muchos alumnos).
De manera similar, En las migraciones se debe indicar esta relación (muchos a muchos), creando una tabla Pivot (tercera tabla), esto lo realizaremos en el mismo método up de la clase curso.
Si queremos volver hacia atrás la última migración realizada
y luego hacemos
Seeders
Cambiamos el Dataseeder
Seeder cursos
Hacemos lo mismo tabla cursos
Insertar datos en la tabla pivot Laravel
Finalmente la relación de la tablas Alumnos con Cursos que es una relación muchos a muchos, existen funciones que te ofrece Eloquent para llenar la tabla pívot, en nuestro caso la tabla es alumno_curso, el método que utilizaremos es attach().
En la misma clase CursoSeeder creamos la relación que existe entre Alumno y Curso.
En la misma variable $curso se puede referenciar a la tabla alumnos, gracias a la relación que se va a realizar en los modelos Alumno y Curso con el método belongsToMany; con el método attach() se envía el Id de un alumno en específico.
Por último realizamos la referencia de la clase Curso.
Cambiamos Dataseeder
Ejecutar Seeders
Antes hacemos las relaciones para que funcione
Relaciones en Eloquent
En tabla Profesores con la tabla Cursos, existe una relación muchos a uno (Un profesor puede dictar muchos cursos, un curso puede ser dictado por un solo profesor) .
Definir relaciones en los modelos
En el modelo Profesor utilizaremos el método hasMany que define la relación uno a muchos.
Para definir la inversa de una relación utilizaremos en el modelo Curso el método belongsTo que define la relación muchos a uno.
De igual forma, veremos la relación de la tabla Alumnos y Cursos; existe una relación muchos a muchos (Un alumno puede tomar varios cursos, un curso puede tener muchos alumnos), la relación muchos a muchos lo plasmamos en nuestro modelo.
En el modelo Alumno utilizaremos el método belongsToMany que define la relación, muchos a muchos.
Del mismo modo en el modelo Curso utilizamos el mismo método belongsToMany que define la relación muchos a muchos.
Ahora se ejecutamos los seeders
Este código lo primero que hará es eliminar todas las tablas de nuestra base de datos y seguidamente volverá a generar todas las tablas sin datos. Ahora ejecutamos la siguiente línea de código que llenará las tablas con datos.
Comprobamos en la BD
Tenemos la estructura de nuestra BD
Factories
Laravel cuenta con los Factories que es otro forma de llenar los datos de una forma más automatizada, y generar gran cantidad de datos.
Factory Profesor
Este comando creara un clase ProfesorFactory dentro de la carpeta database/factories, si exploramos el archivo vemos que hace referencia al Modelo Profesor.
llenamos de datos nuestro ProfesorFactory en el método definition() dentro de return definimos todos los campos de nuestra tabla profesores con sus respectivos tipos de valores.
Ahora para poder utilizar la clase ProfesorFactory, nos vamos a nuestro clase ProfesorSeeder, comentamos el código que anteriormente desarrollamos y escribimos lo siguiente:
Factory Alumno
Realizaremos los mismos pasos en la clase AlumnoFactory,
Factory Curso
Por último vemos la tabla cursos, como en los Seeders hay que prestarle atención a esta clase por las relaciones que tiene la tabla cursos con las tablas profesores y alumnos de la base de datos.
Crearemos la clase CursoFactory.
Igual que en los anteriores Factories llenamos los campos de la tabla cursos, aquí lo diferente es que se tiene que ver la relación que existe primero entre la tabla cursos con la tabla profesores.
Al momento de referenciar el campo profesor_id, voy a llamar al Modelo Profesor, recuperar todos los registros y por último aleatoriamente escoger un ID
Ahora iremos a la clase CursoSeeder, comentamos el código anterior, y escribimos la siguiente línea de código.
Esta línea de código primeramente creará 10 registros en la tabla cursos, seguidamente creará 40 registro en la tabla alumno, por último creará las relaciones en la tabla alumno_curso por cada curso estarán registrados cuatro alumnos.
DataSeeder
Ejecutar los Factories
Por último ejecutamos desde Artisan las migraciones y los seeders, con el fin de llenar de datos nuestra base de datos con los cambios realizados.