Mysql query like this :
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;
I want to convert it to Laravel Eloquent, but I’m confused. Because there exist many statement. There exist PREPARE
, EXECUTE
, SET
, DEALLOCATE
etc. You can see query above.
How can I convert it to Laravel Eloquent?
Advertisement
Answer
You don’t need to manually prepare statements (PREPARE
, EXECUTE
, DEALLOCATE
) in Laravel since the Query Builder calls PDO::prepare
, PDO::bindValue
and PDO::execute
behind the scenes.
You will be responsable for escaping/sanitizing the input however.
You can achieve this query by using a few raw methods with the query builder.
After some experimentation, I found out the real sql query created by your code is something like this:
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)
To translate this into the query builder, we’ll need 2 queries:
/** * 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');
Since we didn’t call ->get()
, we can still add to the query.
// 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();
You can verify this produces the query by dumping $query->>toSql()
.