@Nacchann0612

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

laravel フリーマーケット(フリマ)アプリ

解決したいこと

laravelでフリマアプリを作っています。
新規出品画面から出品した後、トップ画面もしくは出品商品一覧画面に出品した商品が全く表示されません。
解決方法を教えてください。

発生している問題・エラー

![スクリーンショット 2023-08-20 164009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531011/6f964aa4-f891-80b6-9baa-25672f9e290e.png)

![スクリーンショット 2023-08-20 163801.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531011/6cb126ad-a737-f4ce-f258-c38d999caa8c.png)

該当するソースコード

web.php
<?php

use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\LikeController;
use App\Http\Controllers\MypageController;
use App\Http\Controllers\ItemController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "web" middleware group. Make something great!
|
*/

Auth::routes();

Route::get('/', [ItemController::class, 'index'])->name('top');

Route::controller(MypageController::class)->group(function () {
    Route::get('/profile/edit', 'edit')->name('profile.edit');
    Route::patch('/profile', 'update')->name('profile.update');
    Route::get('/profile/edit_image', 'editImage')->name('profile.edit_image');
    Route::patch('/profile/edit_image', 'updateImage')->name('profile.update_image');
    
    Route::get('/users', [MypageController::class, 'show'])->name('users.show');
});

Route::resource('items', ItemController::class);

Route::controller(ItemController::class)->group(function () {
    Route::get('/users/{user}/exhibitions', 'exhibitions')->name('users.exhibitions');
    Route::get('/items/{item}/edit_image', 'editImage')->name('items.edit_image');
    Route::patch('/items/{item}/edit_image', 'updateImage')->name('items.update_image');
    
    Route::get('/items/{item}/confirm', 'confirm')->name('items.confirm');
    Route::get('/items/{item}/finish', 'finish')->name('items.finish');
});

Route::resource('likes', LikeController::class)->only([
    'index'
]);
?>

ItemController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\ItemRequest;
use App\Http\Requests\ItemEditRequest;
use App\Http\Requests\ItemImageRequest;
use App\Services\FileUploadService;
use App\Models\Item;
use App\Models\Category;
use App\Models\Order;
use App\Models\User;

class ItemController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        $this->category = new Category();
    }
     /**
     * Display a listing of the resource.
     */
    public function index()
    {
        $items = Item::where('user_id','!=', \Auth::id())->latest()->limit(6)->get();
        $image = '';
        $category = Item::where('category_id')->get();
        return view('top', [
            'title' => 'トップページ',
            'items' => $items,
            'image' => $image,
            'category' => $category,
        ]);
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create(ItemRequest $request)
    {
        $categories = Category::get();
        $image = '';
        return view('items.create', compact('categories'), [
            'title' => '商品を出品',
            'image' => $image,
            'categories' => $categories,
        ]);
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(ItemRequest $request)
    {
        $path = $service->saveImage($request->file('image'));
        $path= '';
        if($path){
             Item::create([
                'user_id' => \Auth::user()->id,
                'name' => $request->name,
                'description' => $request->description,
                'category_id' => $request->category_id,
                'price' => $request->price,
                'image' => $path,
            ]);
            session()->flash('success', '商品を出品しました');
        } else {
            session()->flash('error', '商品の出品に失敗しました。');
        }
        return redirect()->route('users.exhibitions', \Auth::user());
    }

    /**
     * Display the specified resource.
     */
    public function show(Item $item)
    {
        return view('items.show', [
            'title' => '商品詳細',
            'item' => $item,
        ]);
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(Item $item)
    {
        $categories = Category::get();
        return view('items.edit', [
            'title' => '商品情報の編集',
            'item' => $item,
            'categories' => $categories,
        ]);
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(ItemEditRequest $request, Item $item)
    {
        $item->update([
            'name' => $request->name,
            'description' => $request->description,
            'price' => $request->price,
            'category_id' => $request->category_id,
        ]);
        
        session()->flash('success', '商品情報を編集しました!');
        return redirect()->route('items.show', $item);
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(Item $item)
    {
        $user = \Auth::user();
        $item->delete();
        
        session()->flash('success', '商品を削除しました');
        return redirect()->route('users.exhibitions', $user);
    }
    
    public function confirm(Item $item)
    {
        return view('items.confirm', [
            'title' => '購入確認画面',
            'item' => $item,
        ]);
    }
    
    public function finish(Item $item)
    {
        if($item->orders()->count() > 0) {
            session()->flash('error', 'この商品は在庫がありません');
            return redirect()->route('items.show', $item);
        } else {
            Order::create([
                'item_id' => $item_id,
                'user_id' => \Auth::id(),
            ]);
        }
        
        return view('items.finish', [
            'title' => 'ご購入ありがとうございました',
            'item' => $item,
        ]);
    }
    
    public function editImage(Item $item)
    {
        return view('items.edit_image', [
            'title' => '商品画像の変更',
            'item' => $item,
        ]);
    }
    
    public function updateImage(ItemImageRequest $request, Item $item, FileUploadService $service)
    {
        // 画像投稿処理
        $path = $service->saveImage($request->file('image'));
        
        if($path){
            $item->update([
                'image' => $path,
            ]);
            session()->flash('success', '商品画像を変更しました');
        } else {
            session()->flash('error', '商品画像の変更に失敗しました');
        }
        return redirect()->route('items.show', $item);
    }
    
    public function exhibitions(User $user)
    {
        return view('users.exhibitions', [
            'title' => '出品商品一覧',
            'user' => $user,
            'items' => $user->items()->latest()->get(),
        ]);
    }
}
?>

ItemRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Http\Controllers\ItemController;

class ItemRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
     */
    public function rules(): array
    {
        return [
            'name' => ['required','max:255'],
            'description' => ['required','max:1000'],
            'price' => ['required', 'integer', 'min:1', 'max:1000000'],
            'category_id' => ['required','exists:categories,id'],
        ];
    }
}
?>

App\Models\Item.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Http\Controllers\ItemRequest;

class Item extends Model
{
    use HasFactory;
    
    protected $fillable = ['user_id', 'name', 'description', 'category_id', 'price', 'image'];
    
    public function likes(){
        return $this->hasMany(Like::class);
    }
    
    public function likedUsers(){
        return $this->belongsToMany(User::class, 'likes');
    }
    
    public function isLikedBy($user){
        $liked_users_ids = $this->likedUsers->pluck('id');
        $result = $liked_users_ids->contains($user->id);
        return $result;
    }
    
    public function likeCount()
    {
        return $this->likes->count();
    }
    
    public function scopeRecommend($query){
        return $query->inRandomOrder()->limit(3);
    }
    
    public function user(){
        return $this->belongsTo(User::class);
    }
    
    public function category(){
        return $this->belongsTo(Category::class);
    }
    
    public function orders()
    {
        return $this->hasMany(Order::class);
    }
}
?>

users/exhibitions.blade.php
@extends('layouts.logged_in')

@section('title', $title)
@section('content')
    <h1>{{ $title }}</h1>
    @if ($user->id === \Auth::id())
        <div class="clearfix mb-3">
            <a class="btn btn-secondary float-right" href="{{ route('items.create') }}">新規出品</a>
        </div>
    @endif
    <ul class="items">
        @forelse($items as $item)
            <li class="item">
                <div class="item_body">
                    <div class="exhibition_img">
                        <a href="{{ route('items.show', $item) }}">
                            <img src="{{ \Storage::url($item->image) }}">
                        </a>
                    </div>
                    <div class="item_body_description">
                        {{ $item->description }}
                    </div>
                    <div class="item_body_name">
                        商品名:{{ $item->name }} {{ $item->price }}
                    </div>
                    <div class="category_name">
                        カテゴリ:{{ $item->category->name }} {{ $item->created_at }}
                    </div>
                    <div>
                        状態:
                        @if($item->orders->count()>0)
                            <span>売り切れ</span>
                        @else
                            <span>出品中</span>
                        @endif
                    </div>
                    @if($user->id === \Auth::id())
                        <div class="item_footer">
                            [<a href="{{ route('items.edit', $item)}}">編集</a>]
                            [<a href="{{ route('items.edit_image', $item) }}">画像を変更</a>]
                            <form method="post" action="{{ route('items.destroy', $item) }}">
                                @csrf
                                @method('DELETE')
                                <button>削除</button>
                            </form>
                        </div>
                    @endif
                </div>
            </li>
        @empty
            <li>商品はありません。</li>
        @endforelse
    </ul>
@endsection

top.blade.php
@extends('layouts.logged_in')

@section('title', $title)

@section('content')
<h1><i>息をするように、買おう。</i></h1>

<h2><a href="{{ route('items.create') }}">新規出品</a></h2>

@forelse($items as $item)
    @if($item->image !== '')
        <a href="{{ route('items.show', $item->id) }}">
            <div>
                <img src="{{ \Storage::url($item->image) }}">
            </div>
        </a>
    @else
        画像はありません。
    @endif
    <p>{{ $item->description }}</p><br>
    <label>商品名: {{ $item->name }}</label>
    <label>カテゴリ: {{ $item->category->name }} [{{ $item->updated_at }}]</label>
@empty
@endforelse
@endsection

自分で試したこと

スペルミスが無いかを確認

0 likes

1Answer

Laravel未経験なので回答できずアドバイス止まりになってしまいますが、どこで想定外の動作になっているか切り分けされましたでしょうか?
・そもそも登録がうまくできていない(成功と表示されるがデータは登録されていない、など)
・登録は成功しておりデータはあるが、バックエンドからうまく返せていない
・バックエンドからデータを返せているが、フロントエンドでうまく表示できていない

上記のどこに原因がありそうかを調査して追記することで、より的確な回答が得られる可能性が高まると思います。

0Like

Your answer might help someone💌