Как получить привязки с типом данных с помощью Laravel 5. * - PullRequest
0 голосов
/ 26 июня 2018

я пытаюсь сделать подзапрос что-то вроде

SELECT COUNT (*) as total_count FROM ($sql) as count_table

здесь метод:

public function getTotal($query = null)
    {
        if (is_null($query)) {
            return $this->total;
        }

        $sql = $query->toSql();

        $bindings = $query->getBindings();

        foreach ($bindings as $binding) {
            $bind = gettype($binding) === '' ? "'" . $binding . "'" : $binding; //is not working as expected
            $sql = preg_replace('/\?/', $bind, $sql, 1);
        }

        dd($sql);

        $sql = str_replace('\\', '\\\\', $sql);

        $total = \DB::connection('sqlsrv')->select(\DB::raw("select count(*) as total_count from ($sql) as count_table"));

        return $total[0]->total_count;
    }

проблема в том, когда я preg_replace all? в запросе sql я получаю только значения без типа данных.

my getBindings ():

array:14 [▼
  0 => 0
  1 => "D"
  2 => 0
  3 => 0
  4 => "CZ"
  5 => "00000"
  6 => "15000"
  7 => "D"
  8 => 0
  9 => 0
  10 => 0
  11 => "AT"
  12 => "0000"
  13 => "2000"
]

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

Я пытался проверить строки с помощью gettype (), но это не работает.

1 Ответ

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

В Laravel 5.6.12 в конструктор запросов была добавлена ​​функция fromSub(), которая делает то, что вы пытаетесь сделать.

Не проверено, но я думаю, что ваша функция будет выглядеть примерно так:

public function getTotal($query = null)
{
    if (is_null($query)) {
        return $this->total;
    }

    return \DB::connection('sqlsrv')
        ->selectRaw('count(*) as total_count')
        ->fromSub($query)
        ->value('total_count');
}

Если вы еще не используете 5.6.12, ваш конкретный запрос может быть полностью обработан с помощью оператора selectRaw, который принимает привязки в качестве второго параметра. В этом случае ваша функция будет выглядеть примерно так:

public function getTotal($query = null)
{
    if (is_null($query)) {
        return $this->total;
    }

    return \DB::connection('sqlsrv')
        ->selectRaw('count(*) as total_count from ('.$query->toSql().') as count_table', $query->getBindings())
        ->value('total_count');
}

Примечание: если вы еще не видели его, функция value() выполняет запрос, получает первую строку, а затем получает значение указанного столбца из этой первой строки. Просто немного чище, чем использовать get() или first() и затем получить доступ к свойству.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...