在检索提供者和服务的订单时调用未定义的方法 Illuminate\Database\Query\Builder::with()

Call to undefined method Illuminate\Database\Query\Builder::with() when retrieving orders with providers and services

我正在尝试检索具有多对多关系的服务名称和提供商名称的订单。 此外,我想使用连接来获取客户端名称。 因此,我使用了下面的代码

      $orders = DB::table('orders')
                ->join('users', 'orders.user', 'users.id')
                ->select('users.name As client', 'orders.id', 'orders.amount As amount','orders.description As description', 'orders.status As status')
                ->with('providers')
                ->with('services')
                ->where(['orders.status'=>1])
                ->get();

在订单模型 class 中,我实现了如下关系

       public function providers() 
{
    return $this->belongsToMany(ServiceProvider::class)
    ->as('provider');
}
public function services() 
{
    return $this->belongsToMany(Service::class)
    ->as('service');
}

有了这个,我希望检索每个订单以及与之相关的所有服务和提供商,因为我有一个外键用户将订单链接到用户 table,我使用连接来获取名称作为客户下订单的用户。现在我的问题是这不起作用并且给出了上面的错误。这是否意味着数据库查询构建器中不存在 with() 方法?如果是这样,我可以使用什么方法与数据库查询生成器一起实现这一目标?如果有 none,我如何使用 eloquent ORM 来达到同样的目的?

当您使用 DB::table() 方法时,您没有使用您的模型,因此用于包含关系的 ->with() 方法不可用。要处理此问题,请使用您的模型:

$orders = Order::join('users', 'orders.user', 'users.id')
->select('users.name As client', 'orders.id', 'orders.amount As amount','orders.description As description', 'orders.status As status')
->with(['providers', 'services'])
->where('orders.status', 1)
->get();

其他修复:

->with() 方法可以接受关系数组以包括:

->with('providers')->with('services') can be written as ->with(['providers', 'services'])

where() 方法可以接受多个 where 子句的数组,但对于单个 where 子句是不必要的:

->where(['orders.status'=>1]) is the same as ->where('orders.status', 1)