Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 876
Neel Avatar asked Jul 10 '15 11:07

Neel


People also ask

What is Laravel eloquent relationships?

Eloquent relationships are defined as methods on your Eloquent model classes. Since relationships also serve as powerful query builders, defining relationships as methods provides powerful method chaining and querying capabilities.

What is advantage of eloquent in Laravel?

The with function will eager load relations without you having to write the query. That is the advantage of Eloquent, it writes the queries for you. No need to create join queries or extra queries for you.

Should I use migration in Laravel?

In Laravel, Migration provides a way for easily sharing the schema of the database. It also makes the modification of the schema much easier. It is like creating a schema once and then sharing it many times.


2 Answers

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

If you have just defined the foreign key in a migration file, the relation would work 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 the other model, only then your models know about each other, and then you can 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.

like image 61
Arslan Ali Avatar answered Oct 01 '22 09:10

Arslan Ali


Eloquent assumes the foreign key of the relationship based on the model name. In this case, the App model is automatically assumed to have an app_id foreign key, so in your migrations you do not need to specify:

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

Documentation

like image 33
apex39 Avatar answered Oct 01 '22 09:10

apex39