laravel フリーマーケット(フリマ)アプリ
解決したいこと
laravelでフリマアプリを作っています。
新規出品画面から出品した後、トップ画面もしくは出品商品一覧画面に出品した商品が全く表示されません。
解決方法を教えてください。
発生している問題・エラー


該当するソースコード
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