Разрешить просмотр только для тех, кто приобрел продукт — Laravel

#laravel #laravel-7 #laravel-6

Вопрос:

 // tables -------------------------------------------------------------
order table - user_id, etc
order_items table - order_id, product_id, price,qty
review table - user_id, product_id etc
 

Я хочу разрешить просмотр только для тех, кто приобрел продукт. это мой последний годовой продукт. Вы можете мне помочь, пожалуйста?

 // saving review table
$review = new Review();
        $review->review_des = $request->review_des;
        $review->rating = $request->rating;
        $review->title = $request->review_title;
        $review->user_id  = Auth::id();
        $review->product_id  = $request->product_id;
        $review->save();

Alert::success('You have successfully added a review to this product.', 'Success Message');
        return redirect()->back();
 

Ответ №1:

Поскольку у пользователя может быть много купленных продуктов, а у продукта может быть много покупателей, создайте purchases сводную таблицу, содержащую идентификатор покупателя и идентификатор продукта (отношение «Многие ко многим»).

 public function up()
{
    Schema::create('buyer_purchase', function (Blueprint $table) {
        $table->bigInteger('buyer_id')->unsigned();
        $table->foreign('buyer_id')->references('id')->on('users')->onCascade('delete');

        $table->bigInteger('purchase_id')->unsigned();
        $table->foreign('purchase_id')->references('id')->on('products')->onCascade('delete');
    });
}
 

Установите взаимосвязь в файлах модели:

 // User.php

public function purchases()
{
    return $this->belongsToMany('AppProduct', 'buyer_purchase', 'buyer_id', 'purchase_id');
}
 
 // Product.php

public function buyers()
{
    return $this->belongsToMany('AppUser', 'buyer_purchase', 'purchase_id', 'buyer_id');
}
 

Затем в своем ProductPolicy файле задайте условие авторизации для определенного действия:

 public function review(User $user, Product $product)
{
    return $product->buyers->contains($user->id);
}
 

Наконец, в вашем ProductController , проверьте, имеет ли пользователь право совершать такие действия:

 public function review(Request $request, Product $product)
{
    $this->authorize('review', $product);

    // ...
}
 

Комментарии:

1. Я думаю, что автор хочет разрешить просматривать продукт только тому пользователю, который купил его.

2. братан, верни $user->id = = = $review->>идентификатор пользователя; ? Я хочу, чтобы пользователь, купивший продукт, мог просмотреть его. (Невозможно просмотреть, если пользователь не купил его.) итак, каков запрос для этого? $user->id === [пользователи, которые приобрели этот продукт]. Очень благодарю вас за помощь мне.

3. @RoomalJayaratne Я только что отредактировал свой ответ. Дай мне знать, если ты это имеешь в виду.

4. Большое вам спасибо 🙂