Neel Neel - 1 month ago 18
MySQL Question

Migration Foreign Key Vs Eloquent Relationships in Laravel

In Laravel 5.1 I can see that table column relationships can be set-up in 2 ways:

1) Defining Foreign Keys in the Migration table.

2) Defining the Eloquent relationships in the Models.

I have read the documentations and I am still confused on the following:


  1. Do I need to use both or only 1 is needed?

  2. Is it wrong to use both at the same time? Or does it make it
    redundant or cause conflicts?

  3. What is the benefit of using Eloquent relationships without mentioning the
    Foreign keys in migration column?

  4. What is the difference?



These are the codes I have now. Its still unclear to me if I need to remove the foreign keys I have set-up in my migration file.

Migration:

public function up()
{

Schema::create('apps', function (Blueprint $table) {
$table->increments('id');
$table->string('app_name');
$table->string('app_alias');
$table->timestamps();
$table->engine = 'InnoDB';
});

// This is the second Migration table
Schema::create('app_roles', function (Blueprint $table) {
$table->increments('id');
$table->integer('app_id')->unsigned()->index();
$table->integer('user_id')->unsigned()->index();
$table->integer('role_id')->unsigned()->index();
$table->engine = 'InnoDB';

$table->unique(array('app_id', 'user_id'));

$table->foreign('app_id')
->references('id')
->on('apps')
->onDelete('cascade');

$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');

$table->foreign('role_id')
->references('id')
->on('roles')
->onDelete('cascade');
});
}


Model with Eloquent Relationships:

// App Model
class App extends Model
{

public function appRoles() {
return $this->hasMany('App\Models\AppRole');
}
}

// AppRole Model
class AppRole extends Model
{
public function app() {
return $this->belongsTo('App\Models\App');
}

public function user() {
return $this->belongsTo('App\User');
}

public function role() {
return $this->belongsTo('App\Models\Role');
}
}

// User Model
class User extends Model implements AuthenticatableContract, CanResetPasswordContract
{
.....
public function appRole() {
return $this->belongsToMany('App\Models\AppRole');
}
}

// Role Model
class Role extends EntrustRole
{
public function appRole() {
return $this->hasMany('App\Models\AppRole');
}
}


Can someone help me understand this please?

Answer

Both go hand in hand. One is in-complete without the other one. If you want to work your relations perfectly, you need to define both things.

If you have just defined the foreign key in you migration file, the relation would work but just in case you write a raw query. It won't work on your models; since, you haven't written anything about relations in your models.

So, as soon as you write hasMany in one of your models, and corresponding function in other model, only then your model knows about it, and then you successfully query things through your model as well as in your database.

Also note that if you have properly defined relations through hasMany and belongsTo in your models, but haven't provided foreign key in the table of the model who belongsTo other table, your relations won't work.

In short, both are equally compulsory.

Comments