После долгих проблем и испытаний я нашел решение своей проблемы. В классе Illuminate\Database\Query\Builder
вы можете найти метод с именем runSelect()
. Этот метод выполняет оператор выбора для данного соединения и возвращает выбранные строки в виде массива.
/**
* Run the query as a "select" statement against the connection.
*
* @return array
*/
protected function runSelect()
{
return $this->connection->select(
$this->toSql(), $this->getBindings(), ! $this->useWritePdo
);
}
Что я сделал, чтобы протестировать свою реализацию в c ++ для запуска select, я сопоставил возвращаемые значения $this->getBindings()
с новым массивом, чтобы внести некоторые необходимые изменения в некоторые строки, и сделал простой str_replace_array
для подготовленного оператора, чтобы получить полный запрос. В конце концов программа на С ++ выполнит подготовленное изменение состояния, а не проанализированный запрос.
Модифицированный метод для моего случая выглядит следующим образом. Это было сделано быстро и грязно, чтобы проверить, возможно ли это, но вы поняли идею. Работает как шарм, за исключением метода count()
в eloquent.
/**
* Run the query as a "select" statement against the connection.
*
* @return array
*/
protected function runSelect()
{
$bindings = [];
foreach ($this->getBindings() as $key => $value) {
$bindings[] = $value; // Some other logic to manipulate strings will be added.
}
$query = str_replace_array('?', $bindings, $this->toSql());
$schemas = ['schema1', 'schema2', 'schema3', 'schema4']; // Will be fetched from master DB.
return runSelectCpp($schemas, $query);
}