如何将此 sql 查询转换为 laravel 查询生成器?
How to convert this sql query into laravel query builder?
我有一个 table(itemregistrationpangkat) 名称(从其他 table itemregistrations 加入),negeri(从其他 table 加入named negeri) 以及开始服务和结束服务的年份。我想获得一个人在某个州服务的年数:
ID | Name | negeri | yearstart | yearend
-----------------------------------------------------------
1 | Tom | Kedah | 2001 | 2002
1 | Tom | Kedah | 2003 | 2007
2 | Anne | Melaka | 2008 | 2012
2 | Anne | Melaka | 2013 | 2018
3 | Bill | KL | 2000 | 2001
只好请教人家如何做SQL查询资料的语句。这是 SQL 语句,其工作方式如下 fiddle http://sqlfiddle.com/#!9/9029438/4(this fiddle 假设 negeri 和 name 列在同一个 table):
select m.id,m.name,m.state,sum(m.duration)
from (select ID,Name,state,yearend-yearstart as duration from itemregistrationpangkat)m
group by m.id,m.state,m.name;
我需要将 sql 语句修改为 laravel sql 具有原始数据库结构的格式。我尝试使用以下代码。它非常冗长,因为它使用 if 语句搜索函数:
$query = DB::table('itemregistrations')
->join('sections', 'itemregistrations.SectionID', '=', 'sections.SectionID')
->join('categories', 'itemregistrations.CategoryID', '=', 'categories.CategoryID')
->join('operasi', 'itemregistrations.OperasiID', '=', 'operasi.OperasiID')
->join('negeri', 'itemregistrations.NegeriID', '=', 'negeri.NegeriID')
->join('gred', 'itemregistrations.GredID', '=', 'gred.GredID')
->where('itemregistrations.statusProID', '=', 1)
->select('itemregistrations.name','sections.sectionname', 'categories.categoryname', 'operasi.operasiname', 'itemregistrations.Nobadan', 'itemregistrations.lahir_yy', 'itemregistrations.pdrm_yy', 'gred.namagred', 'itemregistrations.itemRegistrationID');
if($request->input('negeri_perkhidmatan') != '') {
$query->join('itemregistrationpangkat', 'itemregistrationpangkat.itemRegistrationID', '=', 'itemregistrations.itemRegistrationID')
->where('itemregistrationpangkat.NegeriID', $request->input('negeri_perkhidmatan'));
}
if(request('tempoh_negeri')) {
$query->select(DB::raw("m.ItemRegistrationID, sum(m.duration) from (SELECT itemregistrationpangkat.itemRegistrationID, itemregistrationpangkat.yeartamatkhidmat - itemregistrationpangkat.yearmulakhidmat as duration FROM itemregistrationpangkat) as m"))
->groupBy(DB::raw("m.ItemRegistrationID"));
我已经尝试修改 'tempoh_negeri' 请求选择并且它可以正常工作但仍然没有得到所需的结果。
if(request('tempoh_negeri')) {
$query->select(DB::raw('m.itemregistrationpangkatID, m.itemRegistrationID, sum(m.duration)'))
->from(DB::raw('(SELECT itemRegistrationID, itemregistrationpangkatID, NegeriID, yeartamatkhidmat - yearmulakhidmat as duration FROM itemregistrationpangkat) AS m
RIGHT JOIN itemregistrations ON itemregistrations.itemRegistrationID=m.itemRegistrationID'))
->groupBy('m.itemRegistrationID');
结果以 json 格式发送,以便使用 ajax 显示。它显示错误 500,因为查询未按预期工作。
调试器显示此错误:
Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'from `itemregistrations`
inner join `sections` on `itemregistrations`.`SectionID' at line 1 (SQL:
select m.ItemRegistrationID, sum(m.duration)
from (SELECT itemregistrationpangkat.itemRegistrationID, itemregistrationpangkat.yeartamatkhidmat - itemregistrationpangkat.yearmulakhidmat as duration
FROM itemregistrationpangkat) as m
from `itemregistrations`
inner join `sections` on `itemregistrations`.`SectionID` = `sections`.`SectionID`
inner join `categories` on `itemregistrations`.`CategoryID` = `categories`.`CategoryID`
inner join `operasi` on `itemregistrations`.`OperasiID` = `operasi`.`OperasiID`
inner join `negeri` on `itemregistrations`.`NegeriID` = `negeri`.`NegeriID`
inner join `gred` on `itemregistrations`.`GredID` = `gred`.`GredID` inner join `itemregistrationpangkat` on `itemregistrationpangkat`.`itemRegistrationID` = `itemregistrations`.`itemRegistrationID`
where `itemregistrations`.`statusProID` = 1 and `itemregistrations`.`CategoryID` = 1 and `itemregistrations`.`OperasiID` = 9 and `itemregistrationpangkat`.`NegeriID` = 2 group by m.ItemRegistrationID)
组合这些 SQL 查询的正确语法是什么?
我想出了 Laravel SQL 来按每个项目注册 ID 获取持续时间总和组:
if(request('tempoh_negeri')) {
$query->select(DB::raw('m.itemRegistrationID, m.NegeriID, sum(distinct m.duration)'))
->from(DB::raw('(SELECT itemRegistrationID, NegeriID, yeartamatkhidmat - yearmulakhidmat as duration FROM itemregistrationpangkat) AS m
RIGHT JOIN itemregistrations ON itemregistrations.itemRegistrationID=m.itemRegistrationID'))
->groupBy('m.itemRegistrationID')
->havingRaw('sum(m.duration) >= ?', [request('tempoh_negeri')]);
}
我有一个 table(itemregistrationpangkat) 名称(从其他 table itemregistrations 加入),negeri(从其他 table 加入named negeri) 以及开始服务和结束服务的年份。我想获得一个人在某个州服务的年数:
ID | Name | negeri | yearstart | yearend
-----------------------------------------------------------
1 | Tom | Kedah | 2001 | 2002
1 | Tom | Kedah | 2003 | 2007
2 | Anne | Melaka | 2008 | 2012
2 | Anne | Melaka | 2013 | 2018
3 | Bill | KL | 2000 | 2001
只好请教人家如何做SQL查询资料的语句。这是 SQL 语句,其工作方式如下 fiddle http://sqlfiddle.com/#!9/9029438/4(this fiddle 假设 negeri 和 name 列在同一个 table):
select m.id,m.name,m.state,sum(m.duration)
from (select ID,Name,state,yearend-yearstart as duration from itemregistrationpangkat)m
group by m.id,m.state,m.name;
我需要将 sql 语句修改为 laravel sql 具有原始数据库结构的格式。我尝试使用以下代码。它非常冗长,因为它使用 if 语句搜索函数:
$query = DB::table('itemregistrations')
->join('sections', 'itemregistrations.SectionID', '=', 'sections.SectionID')
->join('categories', 'itemregistrations.CategoryID', '=', 'categories.CategoryID')
->join('operasi', 'itemregistrations.OperasiID', '=', 'operasi.OperasiID')
->join('negeri', 'itemregistrations.NegeriID', '=', 'negeri.NegeriID')
->join('gred', 'itemregistrations.GredID', '=', 'gred.GredID')
->where('itemregistrations.statusProID', '=', 1)
->select('itemregistrations.name','sections.sectionname', 'categories.categoryname', 'operasi.operasiname', 'itemregistrations.Nobadan', 'itemregistrations.lahir_yy', 'itemregistrations.pdrm_yy', 'gred.namagred', 'itemregistrations.itemRegistrationID');
if($request->input('negeri_perkhidmatan') != '') {
$query->join('itemregistrationpangkat', 'itemregistrationpangkat.itemRegistrationID', '=', 'itemregistrations.itemRegistrationID')
->where('itemregistrationpangkat.NegeriID', $request->input('negeri_perkhidmatan'));
}
if(request('tempoh_negeri')) {
$query->select(DB::raw("m.ItemRegistrationID, sum(m.duration) from (SELECT itemregistrationpangkat.itemRegistrationID, itemregistrationpangkat.yeartamatkhidmat - itemregistrationpangkat.yearmulakhidmat as duration FROM itemregistrationpangkat) as m"))
->groupBy(DB::raw("m.ItemRegistrationID"));
我已经尝试修改 'tempoh_negeri' 请求选择并且它可以正常工作但仍然没有得到所需的结果。
if(request('tempoh_negeri')) {
$query->select(DB::raw('m.itemregistrationpangkatID, m.itemRegistrationID, sum(m.duration)'))
->from(DB::raw('(SELECT itemRegistrationID, itemregistrationpangkatID, NegeriID, yeartamatkhidmat - yearmulakhidmat as duration FROM itemregistrationpangkat) AS m
RIGHT JOIN itemregistrations ON itemregistrations.itemRegistrationID=m.itemRegistrationID'))
->groupBy('m.itemRegistrationID');
结果以 json 格式发送,以便使用 ajax 显示。它显示错误 500,因为查询未按预期工作。
调试器显示此错误:
Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'from `itemregistrations`
inner join `sections` on `itemregistrations`.`SectionID' at line 1 (SQL:
select m.ItemRegistrationID, sum(m.duration)
from (SELECT itemregistrationpangkat.itemRegistrationID, itemregistrationpangkat.yeartamatkhidmat - itemregistrationpangkat.yearmulakhidmat as duration
FROM itemregistrationpangkat) as m
from `itemregistrations`
inner join `sections` on `itemregistrations`.`SectionID` = `sections`.`SectionID`
inner join `categories` on `itemregistrations`.`CategoryID` = `categories`.`CategoryID`
inner join `operasi` on `itemregistrations`.`OperasiID` = `operasi`.`OperasiID`
inner join `negeri` on `itemregistrations`.`NegeriID` = `negeri`.`NegeriID`
inner join `gred` on `itemregistrations`.`GredID` = `gred`.`GredID` inner join `itemregistrationpangkat` on `itemregistrationpangkat`.`itemRegistrationID` = `itemregistrations`.`itemRegistrationID`
where `itemregistrations`.`statusProID` = 1 and `itemregistrations`.`CategoryID` = 1 and `itemregistrations`.`OperasiID` = 9 and `itemregistrationpangkat`.`NegeriID` = 2 group by m.ItemRegistrationID)
组合这些 SQL 查询的正确语法是什么?
我想出了 Laravel SQL 来按每个项目注册 ID 获取持续时间总和组:
if(request('tempoh_negeri')) {
$query->select(DB::raw('m.itemRegistrationID, m.NegeriID, sum(distinct m.duration)'))
->from(DB::raw('(SELECT itemRegistrationID, NegeriID, yeartamatkhidmat - yearmulakhidmat as duration FROM itemregistrationpangkat) AS m
RIGHT JOIN itemregistrations ON itemregistrations.itemRegistrationID=m.itemRegistrationID'))
->groupBy('m.itemRegistrationID')
->havingRaw('sum(m.duration) >= ?', [request('tempoh_negeri')]);
}