1. モデルのリレーション設定
データベースのリレーションを利用して、ユーザーが購入した商品を取得できるように設定します。
Userモデル: ユーザーが行った注文を取得します。
Orderモデル: 各注文に関連する注文項目を取得します。
OrderItemモデル: 各注文項目に関連する商品を取得します。
// Userモデル
public function orders() {
return $this->hasMany(Order::class);
}
// Orderモデル
public function orderItems() {
return $this->hasMany(OrderItem::class);
}
// OrderItemモデル
public function product() {
return $this->belongsTo(Product::class);
}
2. コントローラでのデータ取得
ログインしているユーザーの購入した商品のデータを取得する処理をコントローラで実装します。PurchasedCoursesController で以下のようなメソッドを設定します。
public function showPurchasedProducts() {
$user = auth()->user();
$purchasedProducts = $user->orders()
->with('orderItems.product')
->get()
->pluck('orderItems')
->flatten()
->map(function ($item) {
return [
'id' => $item->product->id,
'name' => $item->product->name
];
});
return view('layouts.user-app', compact('purchasedProducts'));
}
3. ミドルウェアの作成と適用
購入した商品情報をすべてのリクエストでビューと共有するために、PurchasedCoursesMiddleware ミドルウェアを作成して適用します。
ミドルウェア作成:
php artisan make:middleware PurchasedCoursesMiddleware
ミドルウェア実装:
php
Copy code
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\View;
class PurchasedCoursesMiddleware
{
public function handle($request, Closure $next)
{
$user = auth()->user();
if ($user) {
$purchasedProducts = $user->orders()
->with('orderItems.product')
->get()
->pluck('orderItems')
->flatten()
->map(function ($item) {
return [
'id' => $item->product->id,
'name' => $item->product->name
];
});
View::share('purchasedProducts', $purchasedProducts);
}
return $next($request);
}
}
ミドルウェア登録:
app/Http/Kernel.php でグローバルまたはルートミドルウェアとして登録します。
4. ビューでの表示
sidebar.blade.php で取得した商品情報をリンクとして表示します。Bladeテンプレートの @foreach を使って各商品に対するリンクを生成します。
@isset($purchasedProducts)
<h2>購入した講座</h2>
@foreach ($purchasedProducts as $product)
<div>
<a href="{{ route('user.products.videos', $product['id']) }}">{{ $product['name'] }}</a>
</div>
@endforeach
@else
<p>購入した講座はありません。</p>
@endisset
5. ルートの設定
商品の詳細ページへのアクセスを提供するためのルートを設定します。
Route::get('/products/{id}/videos', [ItemController::class, 'showVideos'])->name('user.products.videos');