laravel中雄辩的多个连接

时间:2017-12-21 10:11:17

标签: php laravel eloquent

我有三张桌子: 1)订单 2)用户 3)服务

订单表包含: - a)user_id b)service_id

用户表包含: - a)名字 B)姓氏 c)电子邮件

服务表包含: a)service_name

正在发生的事情是网站上的服务提供商正在添加他的服务,这些服务正在保存在服务表中。然而,用户预订这些服务并在预订后使用user_id,并且预订的service_id将保存在订单表中。

我所做的是登录服务提供商只能看到在订单表中预订的用户详细信息。

为此,我使用以下代码,使用雄辩: -

$get_result = App\Order::whereIn('user_id',$user_id)->whereIn('service_id',$service_id)->get();

其中$ user_id包含用户ID,$ service_id包含服务ID。这给出了注册登录提供商服务的用户的结果。

现在,我面临的问题是我想从服务表中获取用户详细信息,如firstname,lastname,来自users表的电子邮件和服务名称。

我该如何以雄辩的方式加入这些表?

2 个答案:

答案 0 :(得分:1)

  

现在,我面临的问题是我想获取用户详细信息,例如firstname,lastname,来自users表的电子邮件和来自服务表的服务名称。

使用eager loading。将此子句添加到您的查询中:

->with(['service', 'user'])

这将为每个Service加载UserOrder个模型。

确保您已在Order模型中定义了关系:

public function user()
{
    return $this->belongsTo(User::class);
}

public function service()
{
    return $this->belongsTo(Service::class);
}

答案 1 :(得分:1)

从现有查询中,使用左连接可以将其扩展到

$get_result = App\Order::whereIn('user_id',$user_id)
->whereIn('service_id',$service_id)
->leftJoin('users', 'orders.user_id', 'users.id')
->leftJoin('services', 'orders.service_id', 'services.id')->get();

如果要选择特定列,可以添加

->select('orders.*', 'users.firstname', 'users.lastname', 'users.email', 'services.name')

如果您不想使用查询进入此路线,您还可以使用预先加载,这会将服务和用户模型添加到您的订单请求中,如https://laravel.com/docs/5.5/eloquent-relationships#eager-loading所述