【问题标题】:Compare relationship data with parent data将关系数据与父数据进行比较
【发布时间】: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


【解决方案1】:

你可以用这个:

class Order extends Model
{
    public function workingHours()
    {
        return $this->hasManyThrough(WorkingHours::class, ConstructionSite::class);
    }
}

$orders = Order::whereHas('workingHours', function($query) {
    $query->select(DB::raw('SUM(worked_hours) total'))
        ->having('total', '>', DB::raw('0.8 * installation_planned_in_hours'));
})->get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    相关资源
    最近更新 更多