mysql - 如何在 laravel 控制器中从 5 个表中编写 mysql 连接子查询
问题描述
我有一个像下面这样的 MySQL 查询,我想在 laravel 控制器中使用它,
我知道如何在laravel中使用join,但是当我们在join语句中有另一个子查询时,我不知道怎么写,
SELECT barangs.id, barangs.kode_barang, barangs.nama_barang,
IFNULL(a.QTY_IN,0) AS masuk, IFNULL(b.QTY_OUT,0) AS keluar,
IFNULL(c.PO_RETUR_QTY,0) AS po_retur, IFNULL(d.CUS_RETUR_QTY,0) AS cus_retur,
barangs.stok AS stok_akhir, barangs.harga_beli
FROM barangs
LEFT JOIN (
SELECT barang_masuk_detail.id_barang, barang_masuk.tgl_masuk, SUM(barang_masuk_detail.qty_terima) AS QTY_IN
FROM barang_masuk
LEFT JOIN barang_masuk_detail ON barang_masuk.id = barang_masuk_detail.id_brg_masuk
/* WHERE barang_masuk.tgl_masuk BETWEEN "2015-08-01" AND "2015-08-31" */
GROUP BY barang_masuk_detail.id_barang ASC
)AS a ON a.id_barang = barangs.id
LEFT JOIN (
SELECT barang_keluar_detail.id_barang, barang_keluar.tgl_kirim, SUM(barang_keluar_detail.qty_dikirim) AS QTY_OUT
FROM barang_keluar
LEFT JOIN barang_keluar_detail ON barang_keluar.id = barang_keluar_detail.id_brg_keluar
/* WHERE barang_keluar.tgl_kirim BETWEEN "2015-08-01" AND "2015-08-31"*/
GROUP BY barang_keluar_detail.id_barang ASC
)AS b ON b.id_barang = barangs.id
/*join retur try */
LEFT JOIN (
SELECT retur_beli_detail.barang_id, retur_beli.tgl_retur, SUM(retur_beli_detail.retur_qty) AS PO_RETUR_QTY
FROM retur_beli
LEFT JOIN retur_beli_detail ON retur_beli.id = retur_beli_detail.retur_id
/* WHERE retur_beli.tgl_retur BETWEEN "2015-08-01" AND "2015-08-31"*/
GROUP BY retur_beli_detail.barang_id ASC
)AS c ON c.barang_id = barangs.id
/*join retur dari customer */
LEFT JOIN (
SELECT retur_kirim_detail.barang_id, retur_kirim.tgl_retur, SUM(retur_kirim_detail.retur_qty) AS CUS_RETUR_QTY
FROM retur_kirim
LEFT JOIN retur_kirim_detail ON retur_kirim.id = retur_kirim_detail.retur_id
/* WHERE retur_kirim.tgl_retur BETWEEN "2015-08-01" AND "2015-08-31"*/
GROUP BY retur_kirim_detail.barang_id ASC
)AS d ON d.barang_id = barangs.id
如果我在 sqlyog 中运行它按预期工作,但不知道如何用 laravel 语法编写它,
哦,如果可以根据用户发送的请求使用 laravel 中的 whereBetween 过滤它,我需要把语法放在哪里?
比如 whereBetween([ $request->startDate, $request->endDate ]);
解决方案
对于使用以下语法执行查询的简单方法:-
DB::select("select * from table JOIN ...");
这将为您提供过滤数据的集合。
编辑代码
要使用whereBetween()
Laravel where 查询,您需要编写 MySQL 查询,如下所示
$startDate = $request->startDate;
$endDate = $request->endDate;
DB::select("
select * from table JOIN ...
where fieldName BETWEEN '$startDate' AND '$endDate'
");
要添加更多条件,我们需要编写 Plain MySQL 查询。
推荐阅读
- r - 使用 pmfa 函数时,R (SensoMineR) 未生成所有图
- python - subprocess.Popen() 不执行命令?
- shell - Keycloak Gatekeeper 未正确设置 X-Auth 标头
- jquery - 卡片大小因图像高度而不同?
- fonts - `rmarkdown`/`bookdown` 中的自定义字体:保留 **bold**/*italic*、特殊字体功能(`--`)等?
- java - 将我的 Android 客户端与 Java 应用服务器连接的最佳方式是什么?
- c++ - QSqlError("", "参数计数不匹配", "") 关于qt
- c - 使用指针反转字符串
- flutter - Flutter 搜索委托,在文本输入中设置一个值或加载最后搜索的值
- java - 如何在客户端上配置 FEIGN 以使用 SEEDSTACK 框架对 REST 服务进行身份验证?