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.
php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger("profession_id");
//restriccion de llave foránea
$table->foreign("profession_id")->references("id")->on("professions");
$table->string('name');
$table->string('email')->unique();//clausura no puede haber un registro igual
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('users');
}
}
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:
php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();//clausura no puede haber un registro igual
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('users');
}
}
php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateProfessionsTable extends Migration
{
public function up()
{
Schema::create('professions', function (Blueprint $table) {
$table->increments('id');
$table->string("title",100)->unique();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('professions');
}
}
php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddProfessionIdToUsers extends Migration
{
public function up()
{
Schema::table("users",function(Blueprint $table)
{
$table->unsignedInteger("profession_id");
$table->foreign("profession_id")->references("id")->on("professions");
});
}
public function down()
{
Schema::table("users",function(Blueprint $table)
{
$table->dropForeign(["profession_id"]);
$table->dropColumn("profession_id");
});
}
}
Para poder comentar es necesario iniciar sesión