Laravel Журнал запросов Eloquent Builder - PullRequest
0 голосов
/ 10 июля 2020

Я сделал JSON поисковую систему для наших API.

Лог c для сборки запросов выглядит следующим образом:

Laravel макрос сделано для включения метода поиска в моделях Eloquent, который создает экземпляр класса и запускает метод поиска:

/**
 * @var $this Builder
 */
$searcher = new Searcher($this, $request);
$searcher->search();

Чтобы все было разделено, классы параметров запроса, которые имеют URL-запросы logi c, создаются динамически и иметь тот же конструктор запросов в качестве зависимости. Внутри foreach l oop выполняется следующее:

new $parameter($this->request, $this->builder, $this->modelConfig);

Чтобы увидеть, что на самом деле искалось, я установил журнал для записи фактического запроса и привязок

Log::info('[Search] SQL: ' . $this->builder->toSql() . " Bindings: " . implode(', ', $this->builder->getBindings()));

Теперь проблема, с которой я столкнулся, заключается в том, что при загрузке связанных моделей (используя ->with() в одном из параметров запроса (RelationsParameter), я получаю то, что я просил, поэтому модель загружается вместе с переданными ей отношениями, однако это никогда не отражается в запросе.

Я всегда получаю SELECT * FROM table WHERE something без упоминания связанной таблицы. Есть ли способ получить и базовый запрос?

Ответы [ 2 ]

0 голосов
/ 22 августа 2020

Я копался глубже в самом Laravel, и ответ на вопрос, почему метод toSql() не сбрасывает и отношение SQL, заключается в том, что оно компилируется до того, как срабатывает метод eagerLoadRelations .

Таким образом, в настоящее время невозможно выгрузить весь SQL при работе с построителями запросов.

То, что предлагает halloei , будет сбрасывать все запросы выполняются, однако на данный момент это мне не помогает, поскольку требует от меня добавления кода вне моего пакета.

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

Вы можете обернуть свой код вокруг регистратора запросов Laravel:

\DB::connection()->enableQueryLog();
// your code
\DB::connection()->disableQueryLog();

После этого вы можете получить зарегистрированные запросы с помощью \DB::getQueryLog().

Однако, если вы просто хочу вести журнал во время разработки, я бы использовал пакет barryvdh / laravel -debugbar .

...