【问题标题】:How can I convert many statement mysql dinamis to laravel eloquent?如何将许多语句 mysql dinamis 转换为 laravel eloquent?
【发布时间】:2020-05-14 01:01:08
【问题描述】:

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,但我很困惑。因为存在很多说法。有PREPAREEXECUTESETDEALLOCATE等,可以看上面的查询。

如何将其转换为 Laravel Eloquent?

【问题讨论】:

    标签: php laravel laravel-5 eloquent


    【解决方案1】:

    您无需在 Laravel 中手动准备语句(PREPAREEXECUTEDEALLOCATE),因为查询生成器在后台调用了 PDO::preparePDO::bindValuePDO::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() 来验证这是否会产生查询。

    【讨论】:

    • 我已经尝试了上述方法,结果就像我在上面发送的图片这就是我正在尝试的:{ $brgs = BarangKeluar::selectRaw("month(tgl_keluar) as m") - >selectRaw("group_concat(distinct concat('sum(if(id_barang = ',id_barang,', jml_bk, 0)) as br', id_barang))") ->whereRaw("month(tgl_keluar) 和 year(tgl_keluar) ")->groupBy(DB::raw("月(tgl_keluar)"))->get()->toArray(); }
    • 谢谢您,先生,非常好的解释并且已经接近我的意思的结果。我试过了,结果:在此处输入图片描述i.stack.imgur.com/r0r4M.png 但是jml_bk(数量)似乎不起作用并且没有得到包装值。
    • 为了得到这样的结果:array:2 [▼ 0 => array:2 [▼ "m" => 1 "br2" => 100 "br3" => 200 ] 1 = > 数组:2 [▼ "m" => 7 "br1" => 100 "br2" => 200"]]
    • m = 是一个月,br (id_product) from as br1, br2 etc and br (id_product) = 100 (sum and group by month) 请再解释一下先生,非常感谢
    • 你确定这个 SQL 查询以前有效吗?我正在尝试运行它,但它会产生与您的图像相似的结果。
    猜你喜欢
    • 2019-01-21
    • 2015-08-19
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多