【问题标题】:How to convert query mysql to laravel query如何将查询mysql转换为laravel查询
【发布时间】:2018-06-19 23:28:31
【问题描述】:

嘿,我在 mysql 中有这个原始查询,我需要翻译成 laravel 5.4 查询生成器:

SELECT MONTH(calendar.datefield) AS Bulan, calendar.datefield AS Tanggal, IFNULL(SUM(dbk.jumlah),0) AS Jumlah 
FROM detail_brg_keluar AS dbk 
INNER JOIN penjualan AS pen ON pen.id = dbk.id_brg_keluar 
RIGHT JOIN calendar ON (DATE(pen.tgl_keluar) = calendar.datefield)
WHERE 
(calendar.datefield BETWEEN 
 (SELECT MIN(DATE(tgl_keluar)) FROM penjualan AS p
    INNER JOIN detail_brg_keluar AS detail ON p.id = detail.id_brg_keluar 
    WHERE detail.id_produk = 818002) 
 AND 
 (SELECT MAX(DATE(tgl_keluar)) FROM penjualan AS pe
    INNER JOIN detail_brg_keluar AS det ON pe.id = det.id_brg_keluar
    WHERE det.id_produk = 818002))
AND (dbk.id_produk = 818002 OR dbk.id_produk IS NULL)
GROUP BY MONTH(calendar.datefield)
ORDER BY calendar.datefield ASC

这是我的 laravel 代码,和代码错误 -_-

$proT = DB::table('detail_brg_keluar AS dbk')
    ->select( DB::raw('MONTH(calendar.datefield) AS Bulan, calendar.datefield AS Tanggal, IFNULL(SUM(dbk.jumlah),0) AS Jumlah '))
    ->join('penjualan AS pen', 'pen.id', '=', 'dbk.id_brg_keluar')
    ->join('calendar', DB::raw('DATE(pen.tgl_keluar)'), '=', 'calendar.datefield')
    ->whereBetween('calendar.datefield', [$from[0]->tanggalAwal, $to[0]->tanggalAkhir])
    ->where(DB::raw('dbk.id_produk = 818002 OR dbk.id_produk IS NULL'))
    ->groupBy(DB::raw('MONTH(calendar.datefield)'))
    ->orderBy(DB::raw('calendar.datefield', 'ASC'))
    ->get();

代码从和到:

$from = DB::table('penjualan AS p')
    ->select(DB::raw('MIN(DATE(tgl_keluar)) AS tanggalAwal'))
    ->join('detail_brg_keluar AS detail', 'p.id', '=', 'detail.id_brg_keluar')
    ->where('detail.id_produk', $id)
    ->get();

$to = DB::table('penjualan AS p')
    ->select(DB::raw('MAX(DATE(tgl_keluar)) AS tanggalAkhir'))
    ->join('detail_brg_keluar AS detail', 'p.id', '=', 'detail.id_brg_keluar')
    ->where('detail.id_produk', $id)
    ->get();

我不知道了?

谢谢大家

【问题讨论】:

    标签: php mysql laravel laravel-5


    【解决方案1】:

    使用这个:

    $from = DB::table('penjualan AS p')
        ->select(DB::raw('MIN(DATE(tgl_keluar)) AS tanggalAwal'))
        ->join('detail_brg_keluar AS detail', 'p.id', '=', 'detail.id_brg_keluar')
        ->where('detail.id_produk', $id);
    $to = DB::table('penjualan AS p')
        ->select(DB::raw('MAX(DATE(tgl_keluar)) AS tanggalAkhir'))
        ->join('detail_brg_keluar AS detail', 'p.id', '=', 'detail.id_brg_keluar')
        ->where('detail.id_produk', $id);
    $proT = DB::table('detail_brg_keluar AS dbk')
        ->select( DB::raw('MONTH(calendar.datefield) AS Bulan, calendar.datefield AS Tanggal, IFNULL(SUM(dbk.jumlah),0) AS Jumlah '))
        ->join('penjualan AS pen', 'pen.id', '=', 'dbk.id_brg_keluar')
        ->rightJoin('calendar', DB::raw('DATE(pen.tgl_keluar)'), '=', 'calendar.datefield')
        ->whereRaw('calendar.datefield BETWEEN ('.$from->toSql().') AND ('.$to->toSql().')', [$id, $id])
        ->where(function($query) {
            $query->where('dbk.id_produk', 818002)->orWhereNull('dbk.id_produk');
        })
        ->groupBy(DB::raw('MONTH(calendar.datefield)'))
        ->orderBy('calendar.datefield', 'ASC')
        ->get();
    
    • 不要执行$from$to,使用生成的SQL。
    • 我将->join('calendar' 替换为->rightJoin('calendar'
    • 我将where(DB::raw()) 替换为嵌套约束。
    • orderBy() 不需要原始表达式。

    【讨论】:

    • 抱歉,此代码错误:“SQLSTATE[42000]: 语法错误或访问冲突:1055 'dbolshop.calendar.datefield' 不在 GROUP BY 中(SQL: select
    • 我假设您只在 phpMyAdmin 中测试了原始查询?但不是在 Laravel (DB::select($sql);) 中?
    • 感谢您的解决方案,查询只需稍作修改
    • 是的,我只是在 phpMyAdmin 中测试查询!因为,我不知道 laravel 中的测试查询
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多