Вам не нужно вручную готовить операторы (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()
.