Красноречивый: где выполняются запросы - PullRequest
0 голосов
/ 09 июля 2019

Atm. Я создаю очень специфическое решение для существующего приложения, написанного на Laravel. Решение выполняет запросы в C ++, изменяет данные, выполняет сортировку и возвращает результаты. Эта программа на С ++ загружается через расширение PHP и служит для обработки этой логики одним методом.
Метод, предоставляемый расширением, должен быть реализован в Laravel с использованием Eloquent, я давно искал исходный код, чтобы найти конкретные методы, которые выполняют сборку запросов с помощью Eloquensts Builder.

Где я могу найти методы, которые фактически выполняют запросы?

Почему с ++? Я слышал, ты думаешь. Запросы должны выполняться в нескольких схемах (и / или базах данных) в нескольких потоках для повышения производительности. Используются схемы Atm 100+, каждая из которых содержит тысячи записей в таблице.

1 Ответ

0 голосов
/ 10 июля 2019

После долгих проблем и испытаний я нашел решение своей проблемы. В классе 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...