如何在laravel雄辩地检索具有多个条件的多个表数据?

时间:2019-04-23 15:33:22

标签: laravel eloquent

我想使用具有多个条件的laravel从4个不同的表中检索数据。

我的桌子概述;

表1

  • id
  • 名称

表2

  • id
  • 名称
  • table1_id

表3

  • id
  • 名称
  • 说明
  • table2_id

表4

  • id
  • 名称
  • 季度
  • table3_id

下面是他们的关系


表1

hasMany -> table 2

表2

 belongsTo ->table1
 HasMany->table2

表3

 belongsTo ->table2
 HasMany->table3

表4

belongsTo ->table3

我想通过具有两个参数的资源展示来获取数据 我尝试过了

   $Report = Table1::whereHas('tabke1', function($query){
        $query->where('year', 'like','%'.$year.'%');
      })
      ->with('table2')->whereHas('table3', function($query){
        $query->where('quarter', 'like', '%'.$quarters.'%');
      })
      ->get();

但是我收到语法错误。

如何从具有多个过滤器的多个表中检索数据? 我尝试使用此表查询来了解更多期望

SELECT `table1`.*, `table2`.*, `table3`.*, `table4`.*
FROM `table1`, `table2`, `table3`, `table4`
WHERE ((`table2`.* year = 2019) AND (`table4`.* quarter = 1))

1 个答案:

答案 0 :(得分:1)

我认为有两个查询可以实现结果。

第一个查询类似于:

Table1::whereHas('table2', function ($query) {
    $query->where('year', 2019);
})
->whereHas('table2.table3.table4', function ($query) {
    $query->where('quarter', 1);
})
->get();

第二个查询类似于:

Table1::select('table1.*')
->join('table2', 'table1.id', '=', 'table2.table1_id')
->join('table3', 'table2.id', '=', 'table3.table2_id')
->join('table4', 'table3.id', '=', 'table4.table3_id')
->where('table2.year', 2019)
->where('table4.quarter', 1)
->distinct()
->get();

关于性能,我更喜欢第二个查询。