0

我想将此 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();
4

1 回答 1

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(...).
于 2021-04-08T00:03:35.217 回答