Как разделить заказы между продавцами и покупателями Laravel?

Я создаю платформу, на которой пользователь может зарегистрироваться и добавлять продукты для продажи. Также другой пользователь может покупать перечисленные продукты. Когда покупатель размещает заказ, я хочу, чтобы его увидел продавец (пользователь), который разместил товар. Прямо сейчас все пользователи могут видеть все заказы, даже если они не являются продавцами.

Я не знаю, как действовать, но вот мой

функция заказа в контроллере продукта

 //Orders View Function
public function viewOrders(){
    $orders = Order::with('orders')->orderBy('id','Desc')->get();
    return view('orders')->with(compact('orders'));
 }

Любая помощь будет оценена по достоинству.


person joh    schedule 13.06.2019    source источник
comment
все зависит от вашей структуры базы данных, как вы ее спроектировали. если вы можете показать вам структуру БД и то, что вы пробовали до сих пор   -  person Salman Zafar    schedule 13.06.2019
comment
В моей базе данных есть две таблицы orders table, в которых есть product_id, user_id, shipping_name и shipping_city, а также еще одна таблица order_product table, в которой есть order_id, product_id и количество. @ Салман   -  person joh    schedule 13.06.2019


Ответы (3)


Ваше viewOrders действие должно быть скрыто за процессом аутентификации (очевидно, что пользователь должен сначала войти в систему, прежде чем он сможет просматривать свои заказы). Как только вы это сделаете (используя auth промежуточное ПО для своего маршрута), Laravel сможет разрешить аутентифицированного пользователя за вас - вы можете просто намекнуть на него как на параметр вашего viewOrders действия:

public function viewOrders(User $user)
{
    $orders = $user->orders()->orderBy('id', 'desc')->get();

    return view('orders')->with(compact('orders'));
}

Как вы заметили, здесь я немного изменил ваш запрос. Вместо того, чтобы выбирать все заказы, мы теперь выбираем их через отношение аутентифицированного пользователя к его заказам. Заказы, очевидно, принадлежат пользователю, но через продукты (в качестве промежуточного звена) - у одного пользователя может быть много продуктов, у одного продукта может быть много заказов, таким образом, у одного пользователя может быть много заказов. В Laravel такая связь между красноречивыми моделями называется HasManyThrough. . Поэтому вы должны объявить это в своей User модели:

class User extends Model {
    ...

    public function orders()
    {
        return $this->hasManyThrough(Order::class, Product::class);
    }
}

Обратите внимание, что ваш Product, вероятно, также будет иметь отношение orders(), но вместо этого он будет иметь тип HasMany, поскольку он прямой без каких-либо промежуточных звеньев.

person d3jn    schedule 13.06.2019
comment
Теперь я получаю thisSQLSTATE[42S22]: Column not found: 1054 Unknown column 'orders.products_model_id' in 'on clause' (SQL: select orders.*, products.user_id` как laravel_throu @ d3jn - person joh; 14.06.2019
comment
В моей модели продуктов она переименована в Products_model, поэтому мне пришлось изменить Product::class на Products_model::class - person joh; 14.06.2019
comment
@joh, если ваши имена отличаются от соглашения об именах Laravel, вам нужно будет указать правильные имена таблиц и внешних ключей для ваших отношений. В вашем случае это будет $this->hasManyThrough(Order::class, Product_model::class, 'user_id', 'product_id'); (Laravel пытается угадать имена столбцов вашего внешнего ключа на основе имен ваших моделей, поэтому для Product_model он ожидал существования product_model_id). - person d3jn; 14.06.2019
comment
Это дает Call to a member function orderBy() on null @ d3jn - person joh; 14.06.2019
comment
@joh hasManyThrough() ни при каких обстоятельствах не может вернуть нулевое значение. Он всегда возвращает экземпляр объекта отношения HasManyThrough. Поэтому убедитесь, что вы действительно возвращаете его из своей orders() функции отношения в User модели. - person d3jn; 14.06.2019

Отфильтруйте базу запросов в соответствии с вашими потребностями

Пример:

Модельные отношения

public function orders(){
    return $this->hasMany(Order::class);
}
public function getMyOrders(User $user){
    $orders = Order::with('orders')->orderBy('id','Desc')->where('user_id','=', $user->id)->get();
return view('orders')->with(compact('orders'));
}

Получить заказы от продавцов

public function getSellerOrders(User $user){
    $products = Product::where('user_id', '=', $user->id)->get();
    $orders = [];
    foreach($products as $product){
        array_merge($orders, $product->order);
    }
    return view('orders')->with(compact('orders'));
}
person Carl Angelo Orale    schedule 13.06.2019
comment
Я попытался получить SellersOrders, но он показывает пустой, заказов нет @Carl - person joh; 14.06.2019
comment
Можете ли вы проверить, получаете ли вы ценность от $ products. попробуйте добавить dd ($ products) после запроса - person Carl Angelo Orale; 14.06.2019
comment
Показывает это значение Collection {#276 ▼ #items: [] } @Carl - person joh; 14.06.2019

В таблице БД для orders вам предлагается иметь 2 идентификатора, один из которых обозначает покупателя, а другой - продавца, т.е. всякий раз, когда пользователь размещает заказ, он должен быть покупателем, а затем вставлять его (покупателя) идентификатор в buyer_id в заказе таблица, аналогично product_id для обозначения продукта из Таблицы продуктов должен быть там, а из Таблицы продуктов вы можете получить seller_id, который предлагается использовать для обозначения того, какой продавец владеет конкретным продуктом. Вставьте seller_id в таблицу заказов и используйте его в своем запросе как:

$seller = Order::where('seller_id',$variable_for_product_id)->with('orders')->get();

Сделайте это для всех продавцов в таблице вашего заказа.

person Sumit Advani    schedule 04.07.2019
comment
что это значит $ variable_for_product_id @Sumit - person helloworld; 04.07.2019
comment
@helloworld $variable_for_product_id - это переменная, имеющая идентификатор продавца из таблицы orders, т.е. seller_id в качестве внешнего ключа из таблицы продавца в таблицу заказов, который вставляется с помощью seller_id в таблицу продукта. - person Sumit Advani; 05.07.2019