souwasora
@souwasora (takei souwa)

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でアパレル閲覧サイト作成中。
詳細画面でコメント機能を作成して、適当にコメントをしてもらい表示をしたいのですが
商品は itemsテーブル
コメントは reviewsテーブル
image.png
image.png
image.png

現在itemsにて作成した商品id[3]にてコメントを書いたのですが、どのようにして
itemsとreviewsを結び付ければいいのか分かりません。
今はとりあえず全て持ってきているので、どの商品でも表示されます。

$reviews = Review::get(); 

解決方法を教えて下さい。

該当するソースコード

controller

<?php

namespace App\Http\Controllers\User;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Models\Item;
use App\Models\User;
use App\Models\Brand;
use App\Models\like;
use App\Models\Review;

**省略
 
    public function show(Item $item, $id)
    {
        $like=Like::where('item_id', $item->id)->where('user_id', auth()->user()->id)->first();
        $reviews = Review::get(); 
        // $reviews =ここの記述が分からない
        $items = Item::find($id);
        return view('home.show', compact('items','like','reviews'));
    }

    public function brand()
    {
        $brands = Brand::get();
        return view('home.brand',compact('brands'));
    }

    public function brand_show($id)
    {
        $brands = Brand::find($id);
        
        $items = item::where('name','like', '%' .$brands->name. '%')->get();
        return view('home.brand_show',compact('brands','items'));
    }

    public function edit($id)
    { 
        $user = User::find($id);
        return view('home.edit',compact('user'));
    }

    public function update(Request $request, $id)
    {
        $user = User::find($id);
        $user->update($request->only(['name','name_kana', 'last_name', 'last_name_kana', 'postal_code', 'address', 'gender', 'telephone_number', 'emmail']));
        return redirect()->route('home');
    }

    
}

show

@extends('layouts.app')
@section('content')
<div class="conteiner">
    <div class="card">
        <div class="row">
            <div class="col-6">
                <div class="photo">
                    <img src="{{ Storage::url($items->image_id) }}" height="600px" >
                </div>
            </div>
            <div class="col-4">
                <div class="name">
                    {{ $items->name}}
                </div>
                <div style="text-align:right;">{{ $items->price}}</div> 
                <div class="introduction">
                    <div class="row mt-5">
                        {{ $items->introduction }}
                    </div>
                </div>
                <span>
                <!-- もし$niceがあればユーザーがいいねをしていたら -->
                @if($like)
                <!-- いいね取消用ボタンを表示 -->
                <a href="{{ route('unlike',$items) }}">
                    <img src="{{asset('img/nicebutton.png')}}" width="30px">
                </a>
                @else
                <!-- まだユーザーがいいねをしていなければ、「いいねボタンを表示 -->
                <a href="{{ route('like',$items) }}" >
                    <img src="{{asset('img/iine.png')}}" width="30px">
                </a>
                @endif
                </span>
            </div>
            <div class="row">
                <div class="col-2"></div>
                <div class="col-10">
                    <h4>コメントを書く</h4>
                    <form method="POST" action="{{ route('review')  }}">@csrf
                        <div class="col-md-4">
                            <textarea  class="form-control"  name="comment" placeholder="コメント" required autocomplete="comment" autofocus></textarea>
                            <button type="submit" class="btn btn-primary">
                                {{ __('コメントを記入') }}
                            </button>
                        </div>
                    </form>
                </div>
            </div>
            <div class="row">
                <div class="col-2"></div>
                <div class="col-10">
                    <h4>コメント一覧</h4>
                    <table class="table table-borderless">
                        <tr>
                            <th>コメント</th>
                            <th>時間帯</th>
                        </tr>
                        @foreach ($reviews as $review)
                        <tr>
                            <td>{{ $review->comment }}</td>
                            <td>{{ $review->created_at }}</td>
                        </tr>
                    </table>
                        
                    @endforeach
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Model

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
    public function likes()
    {
        return $this->hasMany('App\Models\Like');
    }
    public function items()
    {
        return $this->hasMany('App\Models\Items');
    }

    public function reviews()
    {
        return $this->hasMany('App\Models\Review');
    }
以下省略

itemモデル

class Item extends Model
{
    use HasFactory;
    public function user() 
    {
        return $this->belongsTo('App\Models\User');
    }

    public function likes()
    {
        return $this->hasMany('App\Models\Like');
    }

    public function reviews()
    {
        return $this->hasMany('App\Models\Review');
    }

reviewモデル
class Review extends Model
{
    use HasFactory;

    public function user()
    {
        return $this->belongsTo('App\Models\user');
    }

    public function item()
    {
        return $this->belongsTo('App\Models\item');
    }

自分で試したこと

いろいろ試しました。リレーション見直したのですが、解決策お願い致します。

0

1Answer

$reviews = $item->reviews;

リレーション設定してあるので上記で取れませんか?

0Like

Comments

  1. @souwasora

    Questioner

    @kamotetu様
    回答ありがとうございます。
    そちらはshow.blade.phpでのお話ですよね?
    controllerは
    $reviews = Review::get();←全て持ってきてるので全部表示されています。

    viewの方に$reviews = $item->reviews;の記述しても解決はできませんでした。
    リレーションが悪いのですかね?
  2. ん?
    いや、controllerのshowアクションの中の
    $reviews = Review::get();
    // $reviews =ここの記述が分からない
    との内容でしたので、
    $reviews = $item->reviews;
    にしたらItemに紐ずくReviewが取得できるんじゃないかなと思ったのですが
    質問の内容に即してなかったらすいません

Your answer might help someone💌