[英]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.