【发布时间】:2018-10-05 14:19:50
【问题描述】:
我在数据库中有这些模型及其对应的表:
- 订购
- 建筑工地
- 工作时间
订单hasOneConstructionSite 反过来hasManyWorkingHours。
在我的表orders 中有一个列installation_planned_in_hours,在我的表working_hours 中有一个列worked_hours。
检索所有worked_hours(记住Order->ConstructionSite->WorkingHours)至少占installation_planned_in_hours 80% 的订单的最佳和更有效的方法是什么?
编辑 1:
实际例子:
Order:
- id => 10001
- installation_planned_in_hours => 100
ConstructionSite:
- id => 1
- order_id => 10001
WorkingHours:
- id => 1
- construction_site_id => 1
- worked_hours => 5
- id => 2
- construction_site_id => 1
- worked_hours => 7
- id => 3
- construction_site_id => 1
- worked_hours => 8
知道我的模型有这些关系:
class Order extends Model
{
public function constructionSite()
{
return $this->hasOne('App\ConstructionSite');
}
}
class ConstructionSite extends Model
{
public function order()
{
return $this->belongsTo('App\Order');
}
public function workingHours()
{
return $this->hasMany('App\WorkingHours');
}
}
class WorkingHours extends Model
{
public function constructionSite()
{
return $this->belongsTo('App\ConstructionSite');
}
}
那么如何有效地检查与特定订单关联的ConstructionSite 的worked_hours 是否高于或低于订单installation_planned_in_hours 的80%?
更准确地说,我的数据库中有更多条目(更多订单、建筑工地和工作时间)。我怎样才能执行这样的事情:
$orders = Order::where('sum(constructionSite.workingHours.worked_hours)', '>', '80% of installation_planned_in_hours')->get();
编辑 2:
我想出了这个解决方案:
$orders = \App\Order::with('constructionSite.workingHours')->has('constructionSite.workingHours')
->leftJoin('construction_sites', 'construction_sites.order_id', '=', 'orders.id')
->select('orders.*', 'construction_sites.*', 'construction_sites.id as csid')
->leftJoin('working_hours', 'working_hours.construction_site_id', '=', 'construction_sites.id')
->selectRaw('sum(working_hours.worked_hours) as tot_whs')
->groupBy('working_hours.construction_site_id')
->havingRaw('sum(working_hours.worked_hours) > orders.installation_planned_in_hours * 0.8')
->get();
但这真的是最好、更有效的方法吗?
【问题讨论】:
-
您可以将您的模型(代码)添加到您的问题中吗?以及输出示例。
-
@Jonjie 我添加了更多信息,如果您需要更多信息,请告诉我。
标签: php laravel eloquent laravel-5.2 laravel-query-builder