Как создать запрос в Laravel для БД? - PullRequest
0 голосов
/ 13 июня 2018

Я хочу создать запрос в Laravel из этого SQL-запроса:

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'

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Ваш запрос эквивалентен на 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` = ?"
0 голосов
/ 13 июня 2018

Каждый раз, когда я сталкиваюсь со сложными запросами, я всегда использую метод 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'");
0 голосов
/ 13 июня 2018

Полагаю, вы могли бы упростить свой запрос как

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'

И в построителе запросов вы могли бы использовать группирование параметров для обработки or case

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