Я не могу понять, как это сделать. Пользователь может видеть детали своего заказа. Я хочу сделать кнопку, чтобы пользователь мог оставить отзыв о продукте, который он приобрел.
Когда он оставил обзор для продукта, я хочу изменить кнопку «отправить обзор» на «редактировать отзыв». Проблема в том, как это сделать, если он купил 2 или более предметов? Я хочу иметь возможность оставлять обзор для каждого элемента отдельно.
В контроллере у меня есть эта функция:
public function orderView($orderId) { $order = Order::where('order_id', $orderId)->where('user_id', Auth::user()->user_id)->first(); $reviews = Review::where('user_id', Auth::user()->user_id)->first(); return View::make('site.users.orders_view', [ 'order' => $order, 'reviews' => $reviews ]); }
Итак, здесь я выбираю его заказы и обзоры для аутентифицированного пользователя. Где я показываю кнопку на представлении «отправить отзыв», «редактировать обзор», я пробовал это
@forelse($reviews as $review) @if($review->product_id == $item->product_id) @if($review->rating_published == 0) <a>Waiting</a> @else <a href="">Edit</a> @endif @else <a href="">Add</a> @endif @empty <a href="">Add</a> @endforelse
Если у пользователя есть 2 продукта в указанном порядке и оставлено только для одного из них, обе кнопки будут изменены на « Edit Review
.
Я хочу сделать это, если у пользователя есть 2 продукта в этом порядке и обзор для одного из продуктов, чтобы иметь одну кнопку «Редактировать обзор» и один «отправить обзор»,
После добавления отношений в модели продукта и модели Review вы можете отредактировать код контроллера следующим образом:
public function orderView($orderId) { $order = Order::where('order_id', $orderId)->where('status', 1) ->where('user_id', Auth::user()->user_id) ->first(); $productIds = $order->getOrderProductIds(); $reviews = Review::with('item') ->whereHas('item', function($q) use($productIds){ $q->whereIn('product_id', $productIds); }) ->where('user_id', Auth::user()->user_id) ->get(); return View::make('site.users.orders_view', [ 'order' => $order, 'reviews' => $reviews ]); }
Затем добавьте этот метод hepler в модель продукта:
public static function hasReview($reviews, $product_id) { foreach ($reviews as $review) { if ($review->item->product_id == $product_id) { return $review; } } return null; }
И в этом вы должны это сделать:
<?php $review = \App\Product::hasReview($reviews, $item->product_id)?> @if($review != null) @if($review->rating_published == 0) <a class="btn btn-warning btn-xs">Waiting for Approval ID: {{$item->product_id }}</a> @else <a class="btn btn-warning btn-xs" href="{{ URL::to('/users/review/' . $item->product_id . '?_token=' . csrf_token()) }}">Edit Review ID: {{$item->product_id }}</a> @endif @else <a class="btn btn-warning btn-xs" href="{{ URL::to('/users/review/' . $item->product_id . '?_token=' . csrf_token()) }}">Leave Review ID: {{$item->product_id }}</a> @endif
PS: Подумайте о добавлении:
hasReview
Вы можете сделать что-то лучше, с получением отзывов о заказе.
Поэтому в вашей модели продукта вы делаете:
public function reviews() { return $this->hasMany('App\Review'); //depends from namespace of your model Review }
И в вашей модели Обзор:
public function product() { return $this->belongsTo('App\Product'); //depends from namespace of your model Product }
А после в вашем контроллере:
public function orderView($orderId) { $order = Order::where('order_id', $orderId)->where('user_id', Auth::user()->user_id)->first(); return View::make('site.users.orders_view', [ 'order' => $order ]); }
И затем, на ваш взгляд,
@foreach($order->product->reviews as $review) @if($review->user_id == Auth::user()->user_id) <a class="btn btn-warning btn-xs" href="">Edit Review</a></li> @else <a class="btn btn-warning btn-xs" href="">Submit Review</a></li> @endif @endforeach