SQL-запрос выполняется в консоли, но не через построитель запросов Laravel - PullRequest
2 голосов
/ 20 сентября 2019

У меня есть таблица с именем Sanad в Microsoft SQL Server, которая имеет два столбца bedeh и bestan.Я хотел бы получить все коды и сумму его беде и бестана в Ларавеле, при условии, что сумма его беде выше, чем сумма бестана.Кроме того, тип данных bedeh и bestan - деньги.Вот код, который я написал для этой цели в Laravel 6:

DB::table('t1')
  ->fromSub(function ($query){
    return $query->selectRaw('Code, sum(bedeh) bed, sum(bestan) bes')
      ->from('Sanad')
      ->groupBy('Code');
    }, 't1')
  ->where('bed', '>', 'bes')
  ->get();

Однако, когда код выполняется, я сталкиваюсь с проблемой ниже:

[Microsoft] [Драйвер ODBC 17 для SQL Server] [SQL Server] Невозможно преобразовать значение символа в деньги.Значение char имеет неверный синтаксис.(SQL: выберите * из (выберите Код, сумма (bedeh) кровать, сумма (бестан) около

) Интересно, что когда я копирую полученный запрос и запускаю его в Management Studio, онбезошибочно выбирает коды. Кто-нибудь знает, в чем проблема?

Спасибо, Хабиб

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Я, наконец, изменил свой подход: вместо того, чтобы писать запрос для всего процесса, я разделил его на разные части, каждая из которых работает с Eloquent.Чтобы быть точным, я выбрал Code, sum (bedeh) и sum (bestan) следующим кодом:

$codes = Sanad::selectRaw('Code, sum(bedeh) bed, sum(bestan) bes')
   ->groupBy('Code')
   ->get();

Затем я выбрал строки с более высокой суммой bedeh по laravel вместо SQL следующим образом:

$debtors = array();
foreach ($codes as $c) {
    if($c->bes < $c->bed) {
        $debtors[] = $c->Code;
    }
}

Теперь мы можем использовать другой выбор для получения экземпляров Eloquent, таких как:

Person::select(....)->whereIn('Code', $debtors)....->get();

В этом сценарии производительность может снизиться;однако я могу извлечь выгоду из средств Eloquent, таких как нумерация страниц.

Хабиб

0 голосов
/ 20 сентября 2019

Вы пытались привести значения в вашем запросе, т.е.

sum(isnull(cast(bedeh as float),0)) as bed, 
sum(isnull(cast(bestanh as float),0)) as bes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...