エラー文『Invalid argument supplied for foreach()』にハマった


タイトルに記載のあるエラーを解消するために小一時間戦っておりました。
今後、同じ失敗を繰り返さないために記録を残します。

事象

ECアプリ作成においてカートの実装をしていたのですが、indexメソッドにてforeachの引数エラーがでました。

エラー文:Invalid argument supplied for foreach()

どうもこちらのエラーは「foreachの引数が不正だよ」という意味のようです。

CartController.php(indexのみ記載)
class CartController extends Controller
{
  public function index()
  {
    $user = User::findOrFail(Auth::id());
    $products = $user->products;
    $totalPrice = 0;

    foreach($products as $product){
      $totalPrice += $product->price * $product->pivot->quantity;
    }

    return view('user.cart',
      compact('products', 'totalPrice'));
}

要はカートに入れた商品の数×商品の単価をindexで表示したかった訳ですね。

試したこと

https://qiita.com/takuma-jpn/items/678876ad12b9ae9998ac
上記の記事を発見し、foreachの前に(array)をつけることで解決できると思ったのですが、今度はViewファイルの方でエラーがでてしまい、沼にハマってしまいました。

結論

コントローラー内の記述に問題があった訳ではなく、UserモデルとProductモデル間のリレーションに不備がありました。
リレーションの確認をしたところ、UserモデルにProductをリレーションを定義するための以下の記載が漏れていたようです…

app/Models/User.php
use App\Models\Product;

リレーションが定義されてなければそりゃあ引数も空になるよね…っていうことですね。

毎日エラーと戦ってばかりですが、継続してPHPの学習がんばります!