我想使用具有多个条件的laravel从4个不同的表中检索数据。
表1
表2
表3
表4
下面是他们的关系
表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))
答案 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();
关于性能,我更喜欢第二个查询。