如何在 Laravel 中创建对 db 的查询?

Posted

技术标签:

【中文标题】如何在 Laravel 中创建对 db 的查询?【英文标题】:How to create query in Laravel to db? 【发布时间】:2018-11-22 23:02:02 【问题描述】:

我希望通过这个 SQL 查询在 Laravel 中创建查询:

SELECT * FROM kreditanfragen WHERE
send_bank='0'
AND (((beruf=6 || beruf=14 || beruf=29 || beruf=30 || beruf=31) AND netto>601) OR ((beruf1=6 || beruf1=14 || beruf1=29 || beruf1=30 || beruf1=31) AND netto1>601))
AND status_intern!=31
AND land='DE'

【问题讨论】:

那么,你试过吗?你现在有什么代码?你应该看看laravel queries docs 【参考方案1】:

我想您可以将查询简化为

SELECT * 
FROM kreditanfragen 
WHERE send_bank='0'
AND (
    beruf in(6,14,29,30,31) AND netto>601)
    OR
    beruf1 in(6,14,29,30,31) AND netto1>601)
)
AND status_intern != 31
AND land='DE'

在查询生成器中,您可以使用parameter grouping 处理or 案例

DB::table('kreditanfragen')
            ->where('send_bank', '=', 0)
            ->where('status_intern', '<>', 3)
            ->where('land', '=', 'DE')
            ->whereIn('beruf', [6,14,29,30,31])
            ->where(function ($query) 
                $query->where(function ($query) 
                    $query->whereIn('beruf', [6,14,29,30,31])
                          ->where('netto', '>', 601);
                )->orWhere(function ($query) 
                    $query->whereIn('beruf1', [6,14,29,30,31])
                          ->where('netto1', '>', 601);
                );
            )
            ->get();

【讨论】:

@user9660776 这是一个缺少的分号,我已经更新了你现在可以查看的答案【参考方案2】:

您的查询 100 % 等效,但不好。

DB::table('kreditanfragen')
    ->where('send_bank', 0)
    ->where(
        function ($query) use ($berufs) 
            $query->where(function ($query) use ($berufs) 
                $query
                    ->whereIn('beruf', $berufs)
                    ->orWhere('netto', '>', 601);
            )->orWhere(function ($query) use ($berufs) 
                $query
                    ->whereIn('beruf', $berufs)
                    ->orWhere('netto1', '>', 601);
            );
        
    )->where('status_intern', '!=', 31)
    ->where('land', 'DE')
    ->get();

结果是

"select * from `kreditanfragen` where `send_bank` = ? and ((`beruf` in (?, ?, ?, ?, ?) or `netto` > ?) or (`beruf` in (?, ?, ?, ?, ?) or `netto1` > ?)) and `status_intern` != ? and `land` = ?"

执行相同查询的正确方法

DB::table('kreditanfragen')
    ->where('send_bank', 0)
    ->where(
        function ($query) use ($berufs) 
            $query
                ->whereIn('beruf', $berufs)
                ->where(function ($query) 
                    $query
                        ->where('netto', '>', 601)
                        ->orWhere('netto1', '>', 601);
             );
    )->where('status_intern', '!=', 31)
    ->where('land', 'DE')
    ->get();

结果是

"select * from `kreditanfragen` where `send_bank` = ? and (`beruf` in (?, ?, ?, ?, ?) and (`netto` > ? or `netto1` > ?)) and `status_intern` != ? and `land` = ?"

【讨论】:

orWhere 部分你需要beruf1netto1 @MKhalidJunaid 看到最终更正的答案(第二部分) 谢谢,但是请解释一下为什么你输入 orWhere('land','de'),而在原来的时候只是 'and' 错了,我会修复它【参考方案3】:

每当我发现自己面临复杂的查询时,我总是使用 DB::select() 方法,如下所示:

DB::select("SELECT * FROM kreditanfragen WHERE
send_bank='0'
AND (((beruf=6 || beruf=14 || beruf=29 || beruf=30 || beruf=31) AND netto>601) 
OR ((beruf1=6 || beruf1=14 || beruf1=29 || beruf1=30 || beruf1=31) AND netto1>601))
AND status_intern!=31
AND land='DE'");

【讨论】:

以上是关于如何在 Laravel 中创建对 db 的查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ActiveRecords 中创建对 Ruby 中对象的引用?

如何在数据库项目中创建对动态数据库名称的引用?

Laravel 5:如何转储 SQL 查询?

在领域中创建对对象的引用的正确方法

在Firestore中创建对Cloud Storage文档的引用

在 C++ 中创建对三元运算符结果的 const 引用是不是安全?