Laravel 5での「完全な」ショッピングカートシステムの構築について、この記事ではそのステップを詳しく解説します。この記事は、初心者でも理解できるように、Laravelの基本的な知識を前提にしています。ショッピングカート機能は、オンラインストアで必須の機能であり、ユーザーが商品を選んで購入手続きを行う際の中核を成します。
1. 必要な準備
まず最初に、Laravelの環境が整っていることを確認してください。まだインストールしていない場合は、公式サイトからインストールガイドを確認し、セットアップを完了してください。

luacomposer create-project --prefer-dist laravel/laravel shopping-cart
これで新しいLaravelのプロジェクトが作成されます。次に、必要な依存関係をインストールします。今回は、データベースを使用してカートを保存するため、laravel/ui
パッケージを使って認証機能も追加しておくと便利です。
luacomposer require laravel/ui
php artisan ui bootstrap --auth
npm install && npm run dev
これで、ユーザー認証機能を持つ基本的なアプリケーションが準備できました。
2. モデルとマイグレーションの作成
ショッピングカートには、商品情報やユーザーのカート内アイテムを管理するためのデータベースが必要です。まず、カートアイテムを保持するテーブルを作成します。
phpphp artisan make:model CartItem -m
これにより、CartItem
モデルとマイグレーションが作成されます。マイグレーションファイルを以下のように編集します。
php// database/migrations/xxxx_xx_xx_xxxxxx_create_cart_items_table.php
public function up()
{
Schema::create('cart_items', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->foreignId('product_id')->constrained()->onDelete('cascade');
$table->integer('quantity')->default(1);
$table->timestamps();
});
}
ここでは、ユーザーごとに商品のカート内アイテムを管理できるように、user_id
と product_id
の外部キーを定義しています。その後、マイグレーションを実行してテーブルを作成します。
bashphp artisan migrate
3. カートシステムのロジック
次に、カートに商品を追加するロジックを実装します。カートの管理は、通常セッションを利用して行いますが、データベースに保存することもできます。今回は、カートアイテムをデータベースに保存する方法を採用します。
カートアイテムを追加する
CartController
を作成し、カートにアイテムを追加するメソッドを実装します。
phpphp artisan make:controller CartController
CartController
内で、アイテムをカートに追加する処理を記述します。
php// app/Http/Controllers/CartController.php
use App\Models\CartItem;
use App\Models\Product;
use Illuminate\Http\Request;
class CartController extends Controller
{
public function addToCart(Request $request, $productId)
{
$product = Product::findOrFail($productId);
$user = auth()->user();
// カートにアイテムが既にあるか確認
$cartItem = CartItem::where('user_id', $user->id)
->where('product_id', $product->id)
->first();
if ($cartItem) {
// すでにカートに商品がある場合は数量を増やす
$cartItem->quantity += $request->quantity;
$cartItem->save();
} else {
// 新しいカートアイテムを追加
CartItem::create([
'user_id' => $user->id,
'product_id' => $product->id,
'quantity' => $request->quantity,
]);
}
return redirect()->route('cart.index');
}
}
ここでは、product_id
と user_id
を使って、ユーザーがすでにカートに追加した商品を確認し、もし存在すればその商品の数量を更新し、存在しなければ新たにカートに商品を追加する処理を行っています。
カート内アイテムを表示する
次に、ユーザーがカート内に追加した商品を表示するビューを作成します。cart.index
ルートを作成し、カートの内容を表示するビューを実装します。
php// resources/views/cart/index.blade.php
@foreach ($cartItems as $item)
{{ $item->product->name }} - {{ $item->quantity }}個
価格: ¥{{ $item->product->price * $item->quantity }}
@endforeach
カートの内容をコントローラーから渡すために、CartController
に以下のようなメソッドを追加します。
php// app/Http/Controllers/CartController.php
public function index()
{
$cartItems = CartItem::where('user_id', auth()->id())->get();
return view('cart.index', compact('cartItems'));
}
これで、ユーザーがカートに追加した商品を一覧表示するページが完成しました。
4. 購入手続き(チェックアウト)
チェックアウトは、カートに追加されたアイテムを基に最終的な購入処理を行う部分です。ユーザーが購入手続きを完了した際、注文情報をデータベースに保存し、カートアイテムをクリアする必要があります。
まず、Order
モデルとマイグレーションを作成します。
phpphp artisan make:model Order -m
orders
テーブルのマイグレーションを以下のように作成します。
php// database/migrations/xxxx_xx_xx_xxxxxx_create_orders_table.php
public function up()
{
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->decimal('total_price', 8, 2);
$table->timestamps();
});
}
注文を作成する処理を CartController
に追加します。
php// app/Http/Controllers/CartController.php
use App\Models\Order;
public function checkout()
{
$user = auth()->user();
$cartItems = CartItem::where('user_id', $user->id)->get();
// 合計金額を計算
$totalPrice = $cartItems->sum(function ($item) {
return $item->product->price * $item->quantity;
});
// 注文を保存
$order = Order::create([
'user_id' => $user->id,
'total_price' => $totalPrice,
]);
// カートアイテムを削除
CartItem::where('user_id', $user->id)->delete();
return redirect()->route('order.success', ['order' => $order]);
}
これで、ユーザーがカート内のアイテムを基にチェックアウト処理を完了できるようになります。
5. 結論
Laravelでショッピングカートを実装するための基本的なステップは以上です。ここでは、カートアイテムの追加、表示、購入処理までを一通り解説しました。もちろん、実際のオンラインショップでは、支払い処理や発送処理、さらにセキュリティや性能面の最適化など、さまざまな要素が必要になりますが、基本的なカート機能の実装はこのように進めることができます。