Php 对Laravel查询生成器的SQL查询

Php 对Laravel查询生成器的SQL查询,php,mysql,laravel,Php,Mysql,Laravel,我有两张桌子 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 (

我有两张桌子

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代,例如父->子->子

我最初试过这个:

$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'] . " ) 
");
$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']);
$q['register\u id']正确获取寄存器id,$q['area\u id']正确获取区域id

由于这不起作用,它只输出了父项,甚至是具有相同area_id但不同寄存器id的父项,我尝试了以下方法:

$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'] . " ) 
");
$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查询

编辑:

每个寄存器都有自己的寄存器id,这仅用于加强搜索

每个登记册都包含许多风险

每个风险只能有一个风险区域

无论是提供原始sql查询还是使用查询生成器,我每次都得到相同的结果

我唯一得到不同和正确结果的时候是将查询输入到phpmyadmin中,因此我希望在代码中复制工作查询

变量都有正确的值,正如我使用dd检查的那样

我认为原因是我在查询生成器上的语法不正确,这就是为什么我问如何将我的sql查询转换为laravel查询生成器

编辑2:

原始查询输出特定寄存器的所有风险显示的所有风险都属于该寄存器。当我将值硬编码到原始查询中时,无论输入什么register\u id/area\u id组合,都会得到相同的结果,因为这是页面的默认视图。。这让我觉得可能原始查询没有得到正确处理?

要翻译SELECT中的WHERE,你需要使用where

此外,尝试在子查询中使用DB::table也不会产生预期的结果

这:

..,函数$query使用$q{ $query->DB::表“风险区域” ... } 应该是:

..,函数$query使用$q{ $query->来自“风险区域” ... } 然后,翻译后的查询应以如下方式结束:

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();
   

您没有给出这些表之间的关系是什么,也没有解释register\u id在其中的位置。如果您接受了一个有效的SQL查询,将其作为原始查询直接提供给数据库,并得到不同的结果,那么,唯一合理的结论是,非常不安全地注入的变量不包含您认为它们包含的值。您是否尝试过用从数据库中手动选取的值替换原始查询中的值,并运行该值,而不是您应该转义的参数