Asociar Migrations en Laravel

Tablas relacionales en Laravel

Asociar migraciones es la forma de relacionar tablas en Laravel, ya sea añadiendo nuevas migraciones o modificando las existentes.  La elección de una opción u otra dependerá de la fase del proyecto y de los datos que contengan las tablas.

Una opción es añadir a la base de datos un campo id extra para hacer referencia a la tabla correspondiente.

  1. php
  2. use Illuminate\Support\Facades\Schema;
  3. use Illuminate\Database\Schema\Blueprint;
  4. use Illuminate\Database\Migrations\Migration;
  5. class CreateUsersTable extends Migration
  6. {
  7. public function up()
  8. {
  9. Schema::create('users', function (Blueprint $table) {
  10. $table->increments('id');
  11. $table->unsignedInteger("profession_id");
  12. //restriccion de llave foránea
  13. $table->foreign("profession_id")->references("id")->on("professions");
  14. $table->string('name');
  15. $table->string('email')->unique();//clausura no puede haber un registro igual
  16. $table->string('password');
  17. $table->rememberToken();
  18. $table->timestamps();
  19. });
  20. }
  21. public function down()
  22. {
  23. Schema::dropIfExists('users');
  24. }
  25. }

Con el método unsignedInteger se está añadiendo un campo entero que solamente acepta valores positivos y con el método foreign se está haciendo referencia al  id de la tabla professions con una clausura con la cuál no podrá añadirse un registro en profession_id que no exista en la tabla professions.

Nota: En ocasiones se producen errores con las relaciones entre tablas porque algunas tablas requieren datos de otras que aun no se han creado (en el ejemplo de arriba requiere de la tabla professions. Si se ejecuta el comando migrate devolverá un error, ya que necesita que antes se haya creado la tabla professions).

Para este tipo de errores es posible cambiar el nombre del migration sustituyendo la fecha para poder cambiar el orden de los archivos y de esta manera poder efectuar el migrate correctamente.

Otra opción es crear la relación de tablas desde otro migration  creando los campos necesarios sin alterar los otros:

  1. php
  2. use Illuminate\Support\Facades\Schema;
  3. use Illuminate\Database\Schema\Blueprint;
  4. use Illuminate\Database\Migrations\Migration;
  5. class CreateUsersTable extends Migration
  6. {
  7. public function up()
  8. {
  9. Schema::create('users', function (Blueprint $table) {
  10. $table->increments('id');
  11. $table->string('name');
  12. $table->string('email')->unique();//clausura no puede haber un registro igual
  13. $table->string('password');
  14. $table->rememberToken();
  15. $table->timestamps();
  16. });
  17. }
  18. public function down()
  19. {
  20. Schema::dropIfExists('users');
  21. }
  22. }
  1. php
  2. use Illuminate\Support\Facades\Schema;
  3. use Illuminate\Database\Schema\Blueprint;
  4. use Illuminate\Database\Migrations\Migration;
  5. class CreateProfessionsTable extends Migration
  6. {
  7. public function up()
  8. {
  9. Schema::create('professions', function (Blueprint $table) {
  10. $table->increments('id');
  11. $table->string("title",100)->unique();
  12. $table->timestamps();
  13. });
  14. }
  15. public function down()
  16. {
  17. Schema::dropIfExists('professions');
  18. }
  19. }
  1. php
  2. use Illuminate\Support\Facades\Schema;
  3. use Illuminate\Database\Schema\Blueprint;
  4. use Illuminate\Database\Migrations\Migration;
  5. class AddProfessionIdToUsers extends Migration
  6. {
  7. public function up()
  8. {
  9. Schema::table("users",function(Blueprint $table)
  10. {
  11. $table->unsignedInteger("profession_id");
  12. $table->foreign("profession_id")->references("id")->on("professions");
  13. });
  14. }
  15. public function down()
  16. {
  17. Schema::table("users",function(Blueprint $table)
  18. {
  19. $table->dropForeign(["profession_id"]);
  20. $table->dropColumn("profession_id");
  21. });
  22. }
  23. }


Comentarios: 0

Para poder comentar es necesario iniciar sesión



Este dominio utiliza cookies de terceros para crear estadísticas y publicidad personalizada. Si continúa navegando está aceptando su uso