簡體   English   中英

到 Laravel 查詢構建器的 SQL 查詢

[英]SQL query to Laravel query builder

我有2張桌子

risks

risk_id    name    area_id
1          a       1
2          b       1

risk_areas

id         name    parent_id
1          a       0
2          b       1
3          c       1
4          d       2

這是我的 sql 查詢:

SELECT * FROM `risks` WHERE (`register_id` = 29 AND `area_id` = 1) 
OR (`area_id` IN (SELECT id FROM risk_areas WHERE parent_id = 1) AND `register_id` = 29 ) 
OR (`area_id` IN (SELECT id FROM risk_areas WHERE parent_id IN (SELECT id FROM risk_areas WHERE parent_id = 1)) AND `register_id` = 29 ) 

在 phpMyAdmin 中運行時,查詢按預期工作。

我一直在嘗試使用查詢構建器將它實現到 Laravel 中。 它從某個寄存器中獲取風險(我以 29 為例)並且還發現了它的所有子級風險(最多只能有 3 代,例如 parent->child->child)

我最初嘗試過這個:

$query-> raw("
    SELECT * FROM `risks` WHERE (`register_id` = " . $q['register_id'] . "  AND `area_id` = ".$q['area_id'].") 
    OR (`area_id` IN (SELECT id FROM risk_areas WHERE parent_id = ".$q['area_id'].") AND `register_id` = " . $q['register_id'] . " ) 
    OR (`area_id` IN (SELECT id FROM risk_areas WHERE parent_id IN (SELECT id FROM risk_areas WHERE parent_id = ".$q['area_id'].")) AND `register_id` =  " . $q['register_id'] . " ) 
");

$q['register_id']獲取register_id$q['area_id']正確獲取area_id

由於這不起作用(它只是輸出了父級,甚至輸出了具有相同 area_id 但寄存器 ID 不同的父級),我嘗試了以下操作:

$query
    ->where('area_id', $q['area_id'])
    ->orWhere('area_id','IN',  function ($query) use($q) {
        $query->where('parent_id',$q['area_id'])
            ->where('register_id',$q['register_id']);
    })
    ->orWhere('area_id','IN',  function ($query) use($q) {
        $query->where('parent_id','IN', function ($query) use($q) {
            $query->where('parent_id',$q['area_id']);
        })
        ->where('register_id',$q['register_id']);
    })
    ->where('register_id',$q['register_id']);

但這與第一個相同。 我的第三次嘗試:

$query
    ->where('area_id', $q['area_id'])
    ->orWhere('area_id','IN',  function ($query) use($q) {
        $query->DB::table('risk_areas')
            ->select(DB::raw('id'))
            ->where('parent_id',$q['area_id'])
            ->where('register_id',$q['register_id']);
    })
    ->orWhere('area_id','IN',  function ($query) use($q) {
        $query->DB::table('risk_areas')
            ->select(DB::raw('id'))
            ->where('parent_id','IN', function ($query) use($q) {
                $query->DB::table('risk_areas')
                    ->select(DB::raw('id'))
                    ->where('parent_id',$q['area_id']);
            })
            ->where('register_id',$q['register_id']);
    })
    ->where('register_id',$q['register_id'])->get();

但這與第一個相同。 如何復制sql查詢?

編輯:

每個寄存器都有自己的 register_id(這僅用於加強搜索)。

每個登記冊都包含許多風險。

每個風險只能有一個 risk_area。

無論是提供原始 sql 查詢還是使用查詢構建器,我每次都得到相同的結果。

我得到不同(和正確)結果的唯一一次是當我將查詢輸入 phpmyadmin 時(因此我想在我的代碼中復制工作查詢)。

正如我使用 dd() 檢查過的那樣,這些變量都具有正確的值。

我認為原因是我在查詢構建器上的語法不正確,這就是為什么我問如何將我的 sql 查詢轉換為 Laravel 查詢構建器。

編輯2:

原始查詢輸出特定寄存器的所有風險(顯示的所有風險都屬於該寄存器)。 當我將值硬編碼到原始查詢中時,我得到相同的結果(無論我輸入什么 register_id/area_id 組合,我都會得到該寄存器的所有結果,因為這是頁面的默認視圖。)。 這讓我覺得原始查詢可能沒有得到正確處理?

要翻譯WHERE IN (SELECT ... ) ,您需要使用whereIn

此外,嘗試在子查詢中使用DB::table()不會產生您期望的結果。

這個:

 .., function ($query) use($q) { $query->DB::table('risk_areas') ... })

應該:

 .., function ($query) use($q) { $query->from('risk_areas') ... })

翻譯后的查詢應該像這樣結束:

DB::table('risks')
    ->where(function ($query) {
        $query->where('register_id', 29)
              ->where('area_id', 1);
    })
    ->orWhere(function ($query) {
        $query->whereIn('area_id', function ($sQuery) {
                  $sQuery->select('id')
                         ->from('risk_areas')
                         ->where('parent_id', 1);
              })
              ->where('register_id', 29);
    })
    ->orWhere(function ($query) {
        $query->whereIn('area_id', function ($sQuery) {
                  $sQuery->select('id')
                         ->from('risk_areas')
                         ->whereIn('parent_id', function ($sQuery2) {
                             $sQuery2->select('id')
                                     ->from('risk_areas')
                                     ->where('parent_id', 1);
                         });
              })
              ->where('register_id', 29);
    })
    ->get();
   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM