通过多对多关系的对象字段从数据库中获取对象

时间:2017-09-19 09:17:26

标签: php mysql laravel eloquent many-to-many

我正在为Web应用程序构建API。我构建的其中一个自定义路由可用于从数据库中获取使用来自特定位置的数据集的所有报告。目前这条路线有点瓶颈,我试图加快速度。

报告可以包含多组数据。数据也可以属于多个报告。数据表包含来自另一个(外部)数据库的数据集的所有位置。

澄清我的数据库看起来像这样:

  Report              pivot table          Data
|-----------|        |-----------|        |-------------|
| Report_id |-------<| Report_id |>-------| Data_id     |
|           |        | Data_id   |        | Location_id |
|-----------|        |-----------|        |-------------|

我编写了以下脚本以使用某个数据集获取所有报告,但我觉得这可以更有效地完成。

 $reports = Report::whereIn('id',
                \DB::table('report_data')->select('report_id')->whereIn('data_id',
                    \DB::table('data')->select('id')->where('location_id', '=', $id)
                )
             )->get();

我在这里遗漏了一些明显的东西,或者这是最好的方法吗?

1 个答案:

答案 0 :(得分:2)

在模型中

Data.php

public function Report()
{
return $this->hasMany('App\Report');
}

Report.php

public function Data()
{
return $this->belongsToMany('App\Data');
}

(您还可以在select查询中提供所有字段) 并在控制器

// To get reports which are having any data
$reports1 = Report::whereHas('Data',function($query) use($id){
    $query->select('id');
    $query->where('location_id',$id);
})->orderBy('id', 'desc')
  ->get();

// To get all reports

$reports2 = Report::with(array('Data'=>function($query)use($id){
    $query->select('id');
    $query->where('location_id',$id);
}))->orderBy('id', 'desc')
    ->get();