将SQL查询转换为Laravel查询生成器的问题

时间:2019-09-05 21:46:15

标签: sql laravel sqlbuilder

我想将此SQL查询转换为LAravel SQL Builder,但我不知道为什么我已经阅读了laravel文档,但找不到答案

SQL查询:

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();

1 个答案:

答案 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(...)
相关问题