Как я могу преобразовать много высказываний mysql dinamis в laravel eloquent? - PullRequest
1 голос
/ 28 января 2020

Mysql запрос такой:

SET @sql_dinamis = (
    SELECT GROUP_CONCAT(
        DISTINCT CONCAT(
            'SUM( IF(id_barang=', id_barang, ',jml_bk,0) ) AS br',
            id_barang
        )
    )
    FROM barang_keluar
);

SET @SQL = CONCAT(
    'SELECT month(tgl_keluar) as m, ',@sql_dinamis,'
    FROM barang_keluar
    WHERE month(tgl_keluar) and year(tgl_keluar)=2019
    GROUP BY month(tgl_keluar)'
);

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Я хочу преобразовать его в Laravel Eloquent, но я в замешательстве. Потому что существует много заявлений. Существуют PREPARE, EXECUTE, SET, DEALLOCATE et c. Вы можете увидеть запрос выше.

Как я могу преобразовать его в Laravel Eloquent?

1 Ответ

0 голосов
/ 28 января 2020

Вам не нужно вручную готовить операторы (PREPARE, EXECUTE, DEALLOCATE) в Laravel, поскольку построитель запросов вызывает PDO::prepare, PDO::bindValue и PDO::execute за кулисами.

Вы будете нести ответственность за экранирование / дезинфекцию входных данных.

Вы можете выполнить этот запрос, используя несколько необработанных методов в построителе запросов.

После некоторых экспериментов, Я обнаружил, что настоящий запрос sql, созданный вашим кодом, выглядит примерно так:

SELECT
    month(tgl_keluar) as m,
    SUM(IF(id_barang=1,jml_bk,0)) AS br42,
    SUM(IF(id_barang=2,jml_bk,0)) AS br48,
    SUM(IF(id_barang=3,jml_bk,0)) AS br13,
    SUM(IF(id_barang=4,jml_bk,0)) AS br14,
    .
    .
    .
    SUM(IF(id_barang=n-1,jml_bk,0)) AS brn-1
    SUM(IF(id_barang=n,jml_bk,0)) AS brn
FROM barang_keluar
WHERE month(tgl_keluar) AND year(tgl_keluar)=2019
GROUP BY month(tgl_keluar)

Чтобы перевести его в построитель запросов, нам понадобится 2 запроса:

/**
 * Equivalent to
 * 
 * SELECT
 *     id_barang 
 * FROM barang_keluar;
 */
$ids_barang = DB::table('barang_keluar')
              ->select('id_barang')
              ->get();
/**
 * Equivalent to
 *
 * SELECT
 *     month(tgl_keluar) as m,
 * FROM barang_keluar
 * WHERE month(tgl_keluar) AND year(tgl_keluar)=2019
 * GROUP BY `m`;
 */

// Pass year as a variable if you want. You can also hardcode it
$year = 2019;
$query = DB::table('barang_keluar')
         ->selectRaw('month(tgl_keluar) as m')
         ->whereRaw('month(tgl_keluar) and year(tgl_keluar)=?', [$year])
         ->groupBy('m');

Поскольку мы не вызывали ->get(), мы все еще можем добавить к запросу.

// Now, we add all the `SUM()` statements.
foreach ($ids_barang as $row) {
    $query->selectRaw("sum(if(eme_id=?,eme_empresa_id,0)) as br{$row->id_barang}", [$row->id_barang]);
}
// And finally, get the query results
$results = $query->get();

Вы можете убедиться, что это создает запрос, выполнив дамп $query->>toSql().

...