Конвертируйте sql inner join в laravel eloquent ORM - PullRequest
0 голосов
/ 17 декабря 2018

Мне трудно преобразовать SQL в красноречивый laravel, особенно в части внутреннего соединения, где я делаю сравнение в "in", отличном от "="

Запрос:

SELECT 
    titulo_id as titulo_id,
-- calculate both SUMs, select values for each dependent by what value it matches to
    SUM(CASE WHEN ativos_extratos.data_import_id = borders.min_id THEN valor_bruto_atual END) AS valor_min,
    SUM(CASE WHEN ativos_extratos.data_import_id = borders.max_id THEN valor_bruto_atual END) AS valor_max,
    data_imports.data_import AS created_at,
    week(data_imports.data_import) AS weeknumber
FROM
    ativos_extratos
        INNER JOIN
    titulos ON titulo_id = titulos.id
        INNER JOIN
    representantes ON representante_id = representantes.id
        INNER JOIN
    data_imports ON data_import_id = data_imports.id    
    INNER JOIN ( SELECT 
                    MIN(ID) as min_id,
                    MAX(ID) as max_id
                 FROM
                    data_imports
                 WHERE
                    data_import BETWEEN '2018-11-01' AND '2018-12-10'
                 GROUP BY week(data_import)
               ) borders ON ativos_extratos.data_import_id IN (borders.min_id, borders.max_id)
WHERE
    user_id = 1
        AND data_imports.data_import BETWEEN '2018-11-01' AND '2018-12-10'
GROUP BY titulos.nome_titulo , weeknumber

Текущий Eloquent ORM

$rows =  AtivosExtrato::select('titulo_id',
    DB::raw('SUM(CASE WHEN ativos_extratos.data_import_id = borders.min_id THEN valor_bruto_atual END) AS valor_init'),
    DB::raw('SUM(CASE WHEN ativos_extratos.data_import_id = borders.max_id THEN valor_bruto_atual END) AS valor_end'),
    'data_imports.data_import AS created_at',
    DB::raw('month(data_imports.data_import) AS weeknumber')
    )
    ->join('titulos','titulo_id', '=', 'titulos.id' )
    ->join('representantes','representante_id', '=', 'representantes.id' )
    ->join('data_imports','data_import_id', '=', 'data_imports.id' )
    ->join(DB::raw("
    ( SELECT 
        MIN(ID) as min_id,
        MAX(ID) as max_id
    FROM
        data_imports
    WHERE
        data_import BETWEEN '2018-10-01' AND '2018-12-10'
    GROUP BY month(data_import)) borders
    "), function ($join){
        $join->on('ativos_extratos.data_import_id', 'in', "(borders.min_id, borders.max_id')");
    })
    ->where('user_id', Auth::user()->id) 
    ->whereBetween('data_import', ['2018-01-01', '2018-12-10'])
    ->groupBy('titulos.nome_titulo')
    ->groupBy('weeknumber')            
    ->orderBy('data_import')            
    ->orderBy('titulos.nome_titulo')
    ->get(); 

Проблема в то время, когда я выполняю объединение, используя "in", ноон не работает должным образом, он объединяет "=" и другие поля.

Erro on execute code.

1 Ответ

0 голосов
/ 17 декабря 2018

Вы можете попробовать использовать , где , Вот пример:

$users = DB::table('users')
                    ->whereIn('id', array(1, 2, 3))->get();

Попробуйте что-то вроде:

$join->whereIn('ativos_extratos.data_import_id', '(borders.min_id, borders.max_id)');

вместо $join->on('ativos_extratos.data_import_id', 'in', "(borders.min_id, borders.max_id')");

Дополнительная документация: https://laravel.com/docs/5.0/queries и https://github.com/illuminate/database/blob/master/Query/Builder.php#L824

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...