How to add Foreign key in Migration – Laravel 8
A foreign key is a field that is used to establish the relationship between two tables via the primary key (You can also use a non-primary field but not recommended).
In this tutorial, I show how you can add a foreign key constraint while creation of table using migration in the Laravel 8 project.
1. Database Configuration
Open .env
file.
Specify the host, database name, username, and password.
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=tutorial DB_USERNAME=root DB_PASSWORD=
2. Create Table and add Foreign Key
Create countries
, states
, and cities
tables using migration.
I am adding foreign key on states
and cities
tables.
states
table is linked tocountries
table, andcities
table is linked tostates
table.
- Create
Countries
table –
php artisan make:migration create_countries_table
- Now, navigate to
database/migration/
folder from the project root. - Find a PHP file that ends with
create_countries_table
and open it. - Define the table structure in the
up()
method.
public function up() { Schema::create('countries', function (Blueprint $table) { $table->id(); $table->string('name'); $table->timestamps(); }); }
- Create
States
table –
php artisan make:migration create_states_table
- Similary, find a PHP file that ends with
create_states_table
indatabase/migration/
folder and open it. - Define the table structure in the
up()
method.
Adding foreign key –
- I am adding foreign key to
country_id
field. - Set datatype of this field to UNSIGNED BIGINT –
$table->unsignedBigInteger('country_id');
. Datatype must beUNSIGNED
and same as parent table linking field datatype. - Here,
countries
tableid
field hasbiginteger
datatype. - Add foreign key –
$table->foreign('country_id') ->references('id')->on('countries')->onDelete('cascade');
Values –
- foreign() – Pass field name which you want to foreign key constraint.
- references() – Pass linking table field name.
- on() – Linking table name.
- onDelete(‘cascade’) – Enable deletion of attached data.
public function up() { Schema::create('states', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('country_id'); $table->string('name'); $table->timestamps(); $table->foreign('country_id') ->references('id')->on('countries')->onDelete('cascade'); }); }
- Create
Cities
table –
php artisan make:migration create_cities_table
- Similary, find a PHP file that ends with
create_cities_table
indatabase/migration/
folder and open it. - Define the table structure in the
up()
method.
Adding foreign key –
- I am adding foreign key to
states_id
field. - Set datatype of this field to UNSIGNED BIGINT –
$table->unsignedBigInteger('state_id');
. Datatype must beUNSIGNED
and same as parent table linking field datatype. - Here,
states
tableid
field hasbiginteger
datatype. - Add foreign key –
$table->foreign('state_id') ->references('id')->on('states')->onDelete('cascade');
Values –
- foreign() – Pass field name which you want to foreign key constraint.
- references() – Pass linking table field name.
- on() – Linking table name.
- onDelete(‘cascade’) – Enable deletion of attached data.
public function up() { Schema::create('cities', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('state_id'); $table->string('name'); $table->foreign('state_id') ->references('id')->on('states')->onDelete('cascade'); $table->timestamps(); }); }
- Run the migration to create tables –
php artisan migrate
3. Model
Create Countries, States, and Cities models.
- Create
Countries
Model.
php artisan make:model Countries
- Open
app/Models/Countries.php
file. - Specify mass assignable Model attributes –
name
using the$filliable
property.
Completed Code
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Countries extends Model { use HasFactory; protected $fillable = [ 'name' ]; }
- Create
States
Model.
php artisan make:model States
- Open
app/Models/States.php
file. - Specify mass assignable Model attributes –
country_id
, andname
using the$filliable
property.
Completed Code
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class States extends Model { use HasFactory; protected $fillable = [ 'country_id','name' ]; }
- Create
Cities
Model.
php artisan make:modelCities
- Open
app/Models/Cities.php
file. - Specify mass assignable Model attributes –
state_id
, andname
using the$filliable
property.
Completed Code
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Cities extends Model { use HasFactory; protected $fillable = [ 'state_id','name' ]; }
4. Conclusion
In the example, I added a single foreign key on a table but you can add more than one foreign key on a table by following the same steps.
« Newest
Newer Posts
Oldest »
Older Posts