【问题标题】:How to Convert this Query to Eloquent or Query Builder?如何将此查询转换为 Eloquent 或查询生成器?
【发布时间】:2020-10-13 14:41:59
【问题描述】:

我有一个这样的查询。我应该如何将其转换为雄辩的或查询构建器

SELECT
x.MATERIAL_ID,
(SELECT TAPET_NAME FROM MA_TAPE_TYPE WHERE TAPET_CODE = x.MATERIAL_TYPE) as media_type,
(SELECT TAPEF_NAME FROM MA_TAPE_FORMAT WHERE TAPEF_CODE = x.MATERIAL_FORMAT) as media_format,
STOCK_MATERIAL_EPI.HOUSE_NO,
x.TXN_DATE,
STOCK_MATERIAL_EPI.PROGRAM_NAME,
CASE WHEN x.iden_flag = 'P' THEN STOCK_MATERIAL_EPI.epi_title WHEN x.iden_flag = 'C'
THEN STOCK_MATERIAL_EPI.prod_version_name WHEN x.iden_flag = 'M' THEN STOCK_MATERIAL_EPI.promo_name 
END as episode_title,
PUR_EPISODE_HDR.EPI_NO,
(SELECT MAX (last_date) FROM run_master WHERE run_master.row_id_epi = PUR_EPISODE_HDR.row_id AND 
run_master.run_aired = 'Y') as last_tx,
x.REMARKS,
x.LOCATION_ID as shelf_no,
stock_material_slag.remarks as short_list
FROM STOCK_MATERIAL x
LEFT JOIN STOCK_MATERIAL_EPI ON x.MATERIAL_ID = STOCK_MATERIAL_EPI.MATERIAL_ID
LEFT JOIN stock_material_slag ON x.MATERIAL_ID = stock_material_slag.MATERIAL_ID
LEFT JOIN PUR_EPISODE_HDR ON STOCK_MATERIAL_EPI.ROW_ID_EPI = PUR_EPISODE_HDR.ROW_ID

我对如何转换它们感到困惑。谁能帮帮我。

我试着这样写。 但它不起作用,

$materials = DB::connection('oracle')
             ->table('STOCK_MATERIAL AS x')
             ->select('x.MATERIAL_ID',
                     DB::raw("(SELECT TAPET_NAME FROM MA_TAPE_TYPE WHERE TAPET_CODE = x.MATERIAL_TYPE) as MEDIA_TYPE"),
                     DB::raw("(SELECT TAPEF_NAME FROM MA_TAPE_FORMAT WHERE TAPEF_CODE = x.MATERIAL_FORMAT) as MEDIA_FORMAT"),
                     'x.TXN_DATE',
                     'y.HOUSE_NO', 'y.PROGRAM_NAME',
                     DB::raw("(CASE WHEN x.IDEN_FLAG = 'P' THEN z.EPI_TITLE WHEN x.IDEN_FLAG = 'C' THEN z.PROD_VERSION_NAME WHEN x.IDEN_FLAG = 'M' THEN z.PROMO_NAME END as EPISODE_TITLE)"),
                     'w.EPI_NO',
                     DB::raw("(SELECT MAX (LAST_DATE) FROM RUN_MASTER WHERE RUN_MASTER.ROW_ID_EPI = w.ROW_ID AND RUN_MASTER.RUN_AIRED = 'Y') as LAST_TX"),
                     'z.REMARKS',
                     'x.LOCATION_ID as SHELF_NO',
                     'z.REMARKS'
                     )
             ->leftJoin('STOCK_MATERIAL_EPI AS y', 'y.MATERIAL_ID', '=', 'x.MATERIAL_ID')
             ->leftJoin('STOCK_MATERIAL_SLAG AS z', 'z.MATERIAL_ID', '=', 'x.MATERIAL_ID')
             ->leftJoin('PUR_EPISODE_HDR AS w', 'w.ROW_ID', '=', 'y.ROW_ID_EPI')

还有什么我写对了吗?

【问题讨论】:

  • 有StockMaterialEpi等雄辩的模型吗?
  • 是的,我有.. 为什么?

标签: laravel eloquent laravel-query-builder


【解决方案1】:

您需要定义 eloquent 模型,然后使用 with()。文档可在以下链接中找到:https://laravel.com/docs/7.x/eloquent-relationships#constraining-eager-loads

例子

StockMaterial::with([
  'maTapeType' => function($query) {
    $query->get('name')
  })
])

对于查询生成器,您可以使用 DB::raw 和 DB::leftJoin 创建相同的查询。

DB::from('STOCK_MATERIAL')
  ->selectRaw([
    'TAPET_NAME as media_type',
    'CASE WHEN x.iden_flag = "P" THEN STOCK_MATERIAL_EPI.epi_title 
       WHEN x.iden_flag = "C" THEN STOCK_MATERIAL_EPI.prod_version_name 
       WHEN x.iden_flag = "M" THEN STOCK_MATERIAL_EPI.promo_name 
     END as episode_title',
  ])
  ->leftJoin('MA_TAPE_TYPE', 'TAPET_CODE', 'STOCK_MATERIAL.MATERIAL_TYPE')

https://laravel.com/docs/7.x/queries#raw-expressions https://laravel.com/docs/7.x/queries#joins

【讨论】:

  • 其实我已经阅读了文档。但我仍然对如何做感到困惑。你能帮我把它写成 eloquent 或 query builder 吗?
  • 我已经给你举例说明了如何使用 eloquent 或查询生成器来做到这一点。在这两种情况下,您都需要使用 selectRaw。您的查询可以改进
  • 另外,最好知道您遇到了什么问题...从您的示例代码来看,您已经取得了一些良好的进展。
  • 那么,我应该使用 selectRaw 而不是 DB:: Raw 吗?
  • 当我们不得不多次使用 DB::raw 时,我建议 selectRaw,这样 laravel 会为您完成大部分工作,而您的复制和粘贴会更少
猜你喜欢
  • 1970-01-01
  • 2021-10-14
  • 2015-07-21
  • 1970-01-01
  • 2020-07-09
  • 2017-06-01
  • 2019-09-08
  • 2013-01-08
相关资源
最近更新 更多