繁体   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