我想将此SQL查询转换为LAravel SQL Builder,但我不知道为什么我已经阅读了laravel文档,但找不到答案
SELECT CONTRATO,CASE WHEN RAZONSOCIAL IS NULL OR RAZONSOCIAL='' THEN ISNULL(PATERNO,'') +' ' + ISNULL(MATERNO,'') +' '+ ISNULL(NOMBRES,'') ELSE RAZONSOCIAL END AS NOMBRE,CADENAUNICA,CLAVERASTREO,FECHAASIENTO,IDGARANTIA, RutaGuardadoPDF, RutaGuardadoXML FROM DEUDORES AS D LEFT JOIN RELACIONES AS R ON D.RUGID=R.RUGID
WHERE CONTRATO='A1412015'
AND D.AcreedorId IN
(SELECT ACREEDORID FROM [MasterCLI].[dbo].[Rrug] WHERE FIDEICOMISOID=5)
我在laravel中执行此代码
$AcreedorFide = \DB::connection('sqlsrv')->table('Rrug')
->select('AcreedorID')
->where('Fideicomiso', $fideicomiso)
->get();
$BoletaRUG = \DB::connection('RUG')->table('Deudores')
->select('Contrato','CadenaUnica','ClaveRastreo','FechaAsiento','IdGarantia', 'RutaGuardadoPDF', 'RutaGuardadoXML')
->select(DB::raw('CASE WHEN RAZONSOCIAL IS NULL' ))
->leftJoin('Relaciones','Deudores.RugId', '=', 'Relaciones.RugId')
->where('Contrato', $Contrato)
->wherein('Acreedorid', $AcreedorFide)
->get();
答案 0 :(得分:0)
在查询生成器中重新创建此查询的最类似于 SQL 的方法如下:
DB::connection('sqlsrv')->query()
->select(
'CONTRATO',
'CADENAUNICA',
'CLAVERASTREO',
'FECHAASIENTO',
'IDGARANTIA',
'RutaGuardadoPDF',
'RutaGuardadoXML'
)
->selectRaw(
"CASE WHEN RAZONSOCIAL IS NULL OR RAZONSOCIAL = '' ".
"THEN ISNULL(PATERNO, '') + ' ' + ISNULL(MATERNO, '') + ' ' + ISNULL(NOMBRES, '') ".
"ELSE RAZONSOCIAL ".
"END AS NOMBRE"
)
->from('DEUDORES', 'D')
->leftJoin('RELACIONES AS R', 'D.RUGID', '=', 'R.RUGID')
->where('CONTRATO', '=', 'A1412015')
->whereIn('D.AcreedorId', function ($query) {
$query->select('ACREEDORID')
->from('MasterCLI.dbo.Rrug')
->where('FIDEICOMISOID', '=', 5);
})
->get();
对于任何坚持翻译查询的人,正如评论所述,在构建器中重新制作大型、复杂查询的最简单方法是使用 ->toSql()
而不是 ->get()
转储查询并检查如果它缺少某些东西。反复试验。
我个人的建议是从子查询开始,然后逐步向上。此外,一些差异/简写:
DB::connection(...)->query()->select(...)->from('DEUDORES', 'D')->where(...)
,DB::connection(...)->table('DEUDORES', 'D')->select(...)->where(...)
'='
,您可以将其保留为隐式。在这个例子中:
leftJoin('RELACIONES AS R', 'D.RUGID', '=', 'R.RUGID')
leftJoin('RELACIONES AS R', 'D.RUGID', 'R.RUGID')
where('CONTRATO', '=', 'A1412015')
变成 where('CONTRATO', 'A1412015')
DB_CONNECTION
文件中的 .env
),您可以跳过查询中的 connection(...)
。 DB::connection(...)->table(...)
变为 DB::table(...)
。