Как удалить продукты, но не заказы, связанные с этим продуктом в Laravel?

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

Прямо сейчас, когда я обновляю/удаляю, это влияет на заказы, отправленные ранее. Вот как я удаляю продукты прямо сейчас.

public function destroy($id) 
{ 
    $userId = Auth::user()->id; 
    $deleteData=product::where('seller_id', $userId)->findOrFail($id); 
    $deleteData->delete(); 

    return redirect()->back(); 
}

Заказ.php

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

public function products()
{
    return $this->belongsToMany('App\Product')->withPivot('quantity','total','Subtotal');
}

public function orderItems()
{
    return $this->hasMany('App\OrderProduct');
}

Редактировать:

Controller for seller orders

// Seller Orders 
 public function viewOrders(User $user)
 {
 //$seller = Auth::user();
 $totals = OrderProduct::select("seller_id", DB::Raw("SUM(Subtotal) AS  total"), 'order_id')
 ->where('seller_id', '=',  \Auth::user()->id)
 ->groupBy('seller_id')
 ->groupBy('order_id')
 ->get();


 $orders = Order::whereHas('orderItems.product', function ($query) {
    $query->where('seller_id', '=',  \Auth::user()->id);
 })->orderBy('id', 'DESC')->withTrashed()->get();
 return view('orders', ['orders'=> $orders, 'total'=> $totals] );
 }

Шаблон лезвия продавца

@foreach ($order->orderItems as $item)
@if ($item->product->user_id == Auth::user()->id)

   <td>{{ $item->name }}</td>
   <td>{{ $item->price }}</td>
@else
  @endif
 @endforeach

ЗаказатьПродукт.php

 class OrderProduct extends Model
{
use SoftDeletes;
protected $table = 'order_product';
protected $fillable = ['order_id', 'seller_id','product_id', 'quantity','Subtotal','total','name','price'];


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

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

aynber 10.07.2019 19:54

@aynber спасибо за ваш ответ. Как насчет редактирования продукта, как это будет работать?

joh 10.07.2019 19:56

Проблема с прямой привязкой продукта к заказу заключается в том, что если продукт редактируется, исторические заказы теряются. Обычно я прикрепляю товар к заказу (ну отдельная таблица order_products), с product_name, product_price и т. д., чтобы редактирование/удаление не мешало. Он по-прежнему связан id, но слабо; он предпочитает снэпшотированные значения, а не живые.

Tim Lewis 10.07.2019 19:59

@TimLewis, я должен переместить цену, названия продуктов и другие данные в таблицу orders_products, если я правильно вас понял?

joh 10.07.2019 20:03

@TimLewis, что означает этот снимок?

joh 10.07.2019 20:04

Снапшот в данном случае означает копирование информации о продукте и сохранение ее в отдельной таблице (orders_products) при создании заказа. Это предполагает, что в заказах может быть несколько продуктов. Но таким образом, когда продукт редактируется, данные на orders_products не обновляются, поэтому у вас не возникнет проблем. Все это немного широко и требует, чтобы первоначальный проект был настроен с учетом этого, поэтому я, вероятно, не могу дать фактический ответ на этот вопрос; просто рекомендации, которые я использую при разработке систем электронной коммерции.

Tim Lewis 10.07.2019 20:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
6
1 136
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавьте черту SoftDeletes в свою модель продукта.

Чтобы получить продукты, включая те, которые были удалены, используйте это:


<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class OrderProduct extends Model
{
    protected $table = 'order_product';
    protected $fillable = ['order_id', 'seller_id','product_id', 'quantity','Subtotal','total'];


    public function product()
    {
        return $this->belongsTo('App\Product')->withTrashed();
    }

}

Если вы не хотите показывать удаленные продукты, вы можете добавить ->whereNull('p.deleted_at') к функции, в которой вы извлекаете свои продукты:

$products = DB::table('recommends AS r')
            ->leftJoin('products AS p', 'r.product_id', '=', 'p.id')
            ->join('products_photos AS pp', 'pp.product_id', '=', 'p.id')
            ->whereNull('p.deleted_at')
            ->select('p.id', 'p.pro_name', 'filename', 'p.pro_price', 'pro_info', DB::raw('COUNT(*) AS total'))
            ->groupBy('p.id', 'p.pro_name', 'filename', 'p.pro_price', 'pro_info')
            ->orderby('total', 'DESC')
            ->take(4);

Это должно решить ваши проблемы.

Надеюсь, поможет.

Я пробовал оба способа (используя мягкое удаление и создавая таблицу продуктов заказа), если я редактирую продукт с обеих сторон, покупатель и продавец не затрагиваются, но если я удаляю продукт, удаляются только заказы продавца, но заказы покупателя остаются @Mateus Junges

joh 10.07.2019 23:30

Как выглядит ваш стол seller oders? @joh

Mateus Junges 10.07.2019 23:38

Вы имеете в виду таблицу заказов или таблицу order_product? @Матеус Юнгес

joh 10.07.2019 23:40

Я имею в виду таблицу, в которой вы сохраняете заказы продавца, которые, как вы мне сказали, были удалены после удаления продукта.

Mateus Junges 11.07.2019 00:08

У вас есть заказы продавца и заказы клиентов, верно? Вы пытались создать таблицу order_products для каждого из них?

Mateus Junges 11.07.2019 00:44

Да, у меня есть заказы продавца и заказы клиентов, а также я создал order_products table @Mateus

joh 11.07.2019 00:46

У меня только один order_products table @Mateus Junges

joh 11.07.2019 00:49

Разве это не решит вашу проблему, если вы создадите таблицу для seller orders и еще одну для custmoer orders?

Mateus Junges 11.07.2019 01:01

это не решило проблему с заказами продавца, если я удалю продукты, это также удалит заказ, а также, как я уже сказал, у меня есть только один order_product table @Mateus

joh 11.07.2019 01:05

Когда я удаляю продукт, он также удаляет product_id в order_product таблице @Mateus Junges

joh 11.07.2019 01:12

Давайте продолжить обсуждение в чате.

Mateus Junges 11.07.2019 01:15

Другие вопросы по теме