購入した商品をサイドバーに商品ページへのリンク形式で表示する

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');