如何在 Backpack 中查看列表视图后面的 AJAX 查询?

How to see AJAX query behind list view in Backpack?

在 Backpack 4.1 中是否可以查看 运行 列表视图后面的实际查询,即 AJAX 查询?对调试很有用。

查看正在使用的查询生成器对象非常简单,您可以通过 $this->crud->query 在控制器中获取它。但是,在您的数据库 上获取将 运行 的实际查询,并为可能应用的任何 where 子句设置 PDO 绑定 等将需要一些设置。

你应该可以做到这一点:

1) 使用以下内容制作一个类似 app/Helpers/Database.php 的文件:

if (! function_exists('asSql')) {
    /**
     * Combines SQL and its bindings
     *
     * @param \Eloquent | \Illuminate\Database\Eloquent\Builder | \Illuminate\Database\Query\Builder $query
     * @return string
     */
    function asSql($query)
    {
        return vsprintf(str_replace('?', '%s', $query->toSql()), collect($query->getBindings())->map(static function ($binding) {
            $binding = addslashes($binding);
            return is_numeric($binding) ? $binding : "'{$binding}'";
        })->toArray());
    }
}

2) 在 app/Providers/AppServiceProvider.php 中添加这个以注册新的辅助方法:

/**
 * Register services.
 *
 * @return void
 */
public function register()
{
    // require all files in app/Helpers/ so their functions get added globally 
    foreach (glob(app_path('Helpers') . '/*.php') as $file) {
        require_once $file;
    }
}

3) 用phpstorm(或类似的IDE)在vendor/backpack/crud/src/app/Library/CrudPanel/Traits/Read.php->getEntries()

中设置断点

在此行设置断点$entries = $this->query->get();

如果你在 php 风暴中,加载列表页面并让断点命中,打开评估工具和 运行 asSql($this->query) 你将看到完全绑定的查询那将是 运行 获取您的记录。

像这样:

这是针对我的用户 CRUD 的查询,我在我的设置中添加了以下内容:

$this->crud->addClause('where', 'active', 1);
$this->crud->orderBy('email');

注意,这可能不会显示查询 运行 获取这些模型的关系(如果应用),在某些情况下会变得更加棘手。

如果你没有 运行宁 php 使用 xdebug 风暴,或者你只是不想在那里做,你也可以从你底部的 crud 控制器添加做这个 setupListOperation 类似

的方法
$sql = asSql($this->crud->query);
dd($sql);