Laravel 8 E-Commerce - Admin Create Model, Migration and Relationship for Checkout

In this video, we are going to learn about creating a Model, Migration, and Relationship for Checkout.

So, let's see how we can create a Model, Migration, and Relationship for Checkout.

For Checkout, we need four tables: Order, OrderItem, Shipping, and Transaction.

So, let's create these tables' models and migrations one by one.

First, switch to the command prompt and run the following command:


php artisan make:model Order –m

php artisan make:model OrderItem –m

php artisan make:model Shipping –m

php artisan make:model Transaction –m

Now, let's open the create_orders_table migration and add the following code:


<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateOrdersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->bigInteger('user_id')->unsigned();
$table->decimal('subtotal');
$table->decimal('discount')->default(0);
$table->decimal('tax');
$table->decimal('total');
$table->string('firstname');
$table->string('lastname');
$table->string('mobile');
$table->string('email');
$table->string('line1');
$table->string('line2')->nullable();
$table->string('city');
$table->string('province');
$table->string('country');
$table->string('zipcode');
$table->enum('status',['ordered','delivered','canceled'])->default('ordered');
$table->boolean('is_shipping_different')->default(false);
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('orders');
}
}

Next, let's open the create_order_items_table migration and add the following code:


<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateOrderItemsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('order_items', function (Blueprint $table) {
$table->id();
$table->bigInteger('product_id')->unsigned();
$table->bigInteger('order_id')->unsigned();
$table->decimal('price');
$table->integer('quantity');
$table->timestamps();
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
$table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('order_items');
}
}

Then, let's open the create_shippings_table migration and add the following code:


<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateShippingsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('shippings', function (Blueprint $table) {
$table->id();
$table->bigInteger('order_id')->unsigned();
$table->string('firstname');
$table->string('lastname');
$table->string('mobile');
$table->string('email');
$table->string('line1');
$table->string('line2')->nullable();
$table->string('city');
$table->string('province');
$table->string('country');
$table->string('zipcode');
$table->timestamps();
$table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('shippings');
}
}

After that, let's open the create_transactions_table migration and add the following code:


<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTransactionsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('transactions', function (Blueprint $table) {
$table->id();
$table->bigInteger('user_id')->unsigned();
$table->bigInteger('order_id')->unsigned();
$table->enum('mode',['cod','card','paypal']);
$table->enum('status',['pending','approved','declined','refunded'])->default('pending');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('transactions');
}
}

Now, open the Order Model and add the following code:


<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Order extends Model
{
use HasFactory;

protected $table = "orders";

public function user()
{
return $this->belongsTo(User::class);
}

public function orderItems()
{
return $this->hasMany(OrderItem::class);
}

public function shipping()
{
return $this->hasOne(Shipping::class);
}

public function transaction()
{
return $this->hasOne(Transaction::class);
}
}

Next, open the OrderItem model and add the following code:


<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class OrderItem extends Model
{
use HasFactory;

protected $table = "order_items";

public function product()
{
return $this->belongsTo(Product::class);
}

public function order()
{
return $this->belongsTo(Order::class);
}

public function review()
{
return $this->hasOne(Review::class,'order_item_id');
}

}

Then, open the Shipping model and add the following code:


<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Shipping extends Model
{
use HasFactory;

protected $table = "shippings";

public function order()
{
return $this->belongsTo(Order::class);
}
}

Finally, open the Transaction model and add the following code:


<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Transaction extends Model
{
use HasFactory;

protected $table = "transactions";

public function order()
{
return $this->belongsTo(Order::class);
}
}

We have now created all four models, migrations, and relationships with models.

So, in this way, you can create a Model, Migration, and relationship for Checkout.