【问题标题】:How to split orders between sellers and buyers Laravel?Laravel 如何在卖家和买家之间拆分订单?
【发布时间】:2019-06-13 20:23:26
【问题描述】:

我正在构建一个平台,用户可以在其中注册并添加要销售的产品。另一个用户也可以购买列出的产品。当买家下订单时,我希望列出产品的卖家(用户)看到它。现在所有用户都可以看到所有订单,即使他们不是卖家。

我不知道如何继续,但这是我的

产品控制器中的订单功能

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

我们将不胜感激。

【问题讨论】:

  • 这完全取决于您的数据库结构是如何设计的。如果您可以向您展示数据库结构以及您迄今为止尝试过的内容
  • 在我的数据库中,有两个表 orders table,其中包含 product_id、user_id、shipping_name 和 shipping_city,还有另一个表 order_product table,其中包含 order_id、product_id 和数量。 @萨尔曼

标签: php laravel laravel-5 eloquent eloquent-relationship


【解决方案1】:

您的viewOrders 操作应该隐藏在身份验证过程之后(显然,用户必须先登录才能查看他的订单)。一旦你这样做了(使用 auth 中间件作为它的路由),Laravel 可以为你解析经过身份验证的用户 - 你可以简单地将其作为 viewOrders 操作的参数提示:

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

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

如您所见,我在这里稍微修改了您的查询。我们现在不是选择所有订单,而是通过经过身份验证的用户与其订单的关系来选择它们。订单明明是属于用户的,但是通过产品(作为中间人)——一个用户可以有很多产品,一个产品可以有很多订单,因此一个用户可以有很多订单。在 Laravel 中,这种 eloquent 模型之间的关系称为HasManyThrough。因此,您应该在 User 模型中声明它:

class User extends Model {
    ...

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

请注意,您的Product 可能也有orders() 关系,但它将是HasMany 类型,因为它是一个没有任何中间体的直接关系。

【讨论】:

  • 现在我得到这个SQLSTATE[42S22]: Column not found: 1054 Unknown column 'orders.products_model_id' in 'on clause' (SQL: select orders.*, products.user_id`作为laravel_throu@d3jn
  • 在我的产品模型中它被重命名为“Products_model”所以我不得不将Product::class更改为Products_model::class
  • @joh 如果您的名称与 Laravel 的命名约定不同,那么您将必须为您的关系指定正确的表和外键名称。在您的情况下,它将是 $this->hasManyThrough(Order::class, Product_model::class, 'user_id', 'product_id');(Laravel 尝试根据您的模型名称猜测您的外键列名称,因此对于 Product_model,它期望 product_model_id 存在)。
  • 它给了这个Call to a member function orderBy() on null@d3jn
  • @joh hasManyThrough() 在任何情况下都不能返回空值。它总是返回HasManyThrough 关系对象的实例。因此,请确保您实际上是从 User 模型中的关系 orders() 函数返回它。
【解决方案2】:

根据您的需要过滤查询

例子:

模型关系

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'));
}

【讨论】:

  • 我尝试获取 SellersOrders 但它显示为空,没有订单@Carl
  • 您能否检查一下您是否从 $products 中获得了价值。尝试在查询后添加 dd($products)
  • 显示这个值Collection {#276 ▼ #items: [] }@Carl
【解决方案3】:

orders 的数据库表中,建议您有 2 个 ID,一个表示买方,另一个表示卖方,即,每当用户下订单时,它必须是买方,然后插入它(买方) ID 到订单表中的buyer_id 中,类似地,用于表示产品表中的产品的product_id 应该在那里,并且从产品表中你可以得到seller_id,建议在那里表示哪个卖家拥有特定产品。将seller_id 插入订单表并将其用于您的查询:

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

对您订单表中的所有卖家执行此操作

【讨论】:

  • 这是什么意思 $variable_for_product_id @Sumit
  • @helloworld $variable_for_product_id 是具有来自orders 表的卖方ID 的变量,即seller_id 作为卖方表到订单表的外键,在seller_id 在产品表中
猜你喜欢
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
相关资源
最近更新 更多