如何在Laravel之外使用Eloquent ORM的getQueryLog()?

时间:2015-01-17 10:01:34

标签: php laravel eloquent

我一直试图找出一种方法来记录我在Zend Framework 1中使用的Eloquent ORM中的SQL查询。我遇到了以这种方式调用的getQueryLog()方法:

$queries = DB::getQueryLog();

我发现Illuminate \ Database \ Connection包含getQueryLog()方法,所以我尝试执行以下操作:

use Illuminate\Database\Connection as DB;

class IndexController
{
    .
    .
    .
    public function indexAction()
    {
        // do stuff (e.g. fetch/update/create rows) 
        $questions = Questions::all()
        .
        .
        $queries = DB::getQueryLog();
        var_dump($queries); exit;
        .
        // render view
    }
}

但是,我收到以下通知,它返回NULL:Notice: Undefined property: IndexController::$queryLog in /var/www/qasystem/vendor/illuminate/database/Illuminate/Database/Connection.php on line 918 NULL

有人可以建议我如何在Laravel之外使用它吗?我在网上搜索过,无法看到我需要做的任何事情,尽管我怀疑大多数例子都会在Laravel中使用。另外,Illuminate \ Database \ Connection是正确的类吗?感谢

2 个答案:

答案 0 :(得分:2)

请改用toSql方法。它会返回最后的查询命令。

有关详细信息,请参阅How do I get the query builder to output its raw SQL query as a string?

答案 1 :(得分:0)

尽管年龄稍大-我只是遇到了同样的问题,并且使用toSql()并没有帮助我,因为我有多对多的关系并且Eloquent执行了更多的查询。

基于@patricus的comment,我可以这样工作:

function getTheThing() {
  (new Thing())->getConnection()->enableQueryLog();
  $thing = Thing::whereUid('something')
    ->with('AnotherThing')
    ->first();
  $loggedSqls = (new Thing())->getConnection()->getQueryLog();
  var_dump($loggedSqls);
}