Laravel 5.x: записывать конкретные запросы SQL в одну и ту же БД - PullRequest
0 голосов
/ 06 ноября 2018

Я провел некоторые исследования по этому вопросу, и я знаю, что могу либо настроить прослушиватель БД в AppServiceProvider, либо создать промежуточное ПО для включения регистрации и перехвата следующих запросов, что даст мне тот же результат - возможность увидеть (получить) последнее попадание SQL в базу данных, но затем я хочу сохранить этот запрос в таблице в той же базе данных. Вопрос, который у меня возникает, заключается в следующем: не сработает ли TH, чтобы запустить другое событие, которое затем будет также захвачено моим слушателем / промежуточным программным обеспечением и сохранено снова ... снова ... снова ... бесконечный цикл? Или я что-то упустил. Есть ли лучший способ сделать это?

ОБЩАЯ ИНФОРМАЦИЯ: У меня есть внешнее приложение для iOS, которое использует те же веб-данные (дублированная sqlite-версия этого mysql db), что и мое веб-приложение laravel, и я хочу, чтобы приложение могло «запрашивать» любые изменения в базе данных mysql и запустите их для базы данных sqlite, нажав веб-приложение laravel и получив операторы sql, которые выполнялись для базы данных mysql со времени последнего запроса 'ask', который я сохранил в таблице dbupdates. Поэтому я хочу отслеживать все (INSERT / UPDATE / DELETE) запросы.

Заранее спасибо.

1 Ответ

0 голосов
/ 07 ноября 2018

Хорошо. Я пошел вперед и попробовал это. Если вы отключите QueryLog () до того, как сохраните запросы, у вас получится.

Вот мое промежуточное ПО, на случай, если вы окажетесь здесь и захотите узнать, как это сделать:

<?php

namespace App\Http\Middleware;

use Closure;
use DB;
use App\Models\DBupdate; // where I store the sqlquery

class BeforeAnyDbQueryMiddleware
{
    public function handle($request, Closure $next)
    {
        DB::enableQueryLog();
        return $next($request);
    }

    public function terminate($request, $response)
    {
    // Store or dump the log data...

        $onlyTheseTables = '.products.chains.chainproducts.stores.principals.';

        $logs = DB::getQueryLog();

        DB::disableQueryLog();
        foreach ($logs as $l) {
            $q = $l['query'];
            if (!(strpos('+INSERTUPDATEDELETE',strtoupper(substr($q,0,6)))===false)) {  // insert, update, delete only
                $px = explode('`',$q);
                if (!(strpos($onlyTheseTables,$px[1])===false)) {  // only these tables
                    $b = $l['bindings'];
                    $needle='?';
                    foreach ($b as $param){
                        $pos = strpos($q, $needle);
                        if ($pos !== false) {
                            $q = substr_replace($q, ((is_numeric($param))?$param:"'".$param."'"), $pos, strlen($needle));
                        }
                    } //foreach
                    $u = new DBupdate;
                    $u->sqlquery=$q;
                    $u->save();
                }
            }
        } // foreach
    }
}

Это будет хранить только запросы INSERT, UPDATE и DELETE для таблиц, перечисленных в $ onlyTheseTables в таблице базы данных 'dbupdates`. Также восстанавливает привязки.

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