ice-s / query-builder-parser
使用jQuery-QueryBuilder时,自动构建复杂的Eloquent & QueryBuilder查询
1.5.7
2020-05-10 13:31 UTC
Requires
- illuminate/database: ^6.0||4.1 - 6.0
Requires (Dev)
- mockery/mockery: ^1.2.3|^0.9.4
- phpunit/phpunit: ^8.3|^7.0
Suggests
- jenssegers/mongodb: Use QueryBuilderParser with MongoDB
README
QueryBuilderParser 主要设计用于Laravel项目内部,但也可以通过使用Illuminate/Database在Laravel项目外部使用。
一个简单易用的jQuery QueryBuilder插件查询构建器。
使用QueryBuilderParser
从QueryBuilder规则构建新的查询。
use timgws\QueryBuilderParser; $table = DB::table('table_of_data_to_integrate'); $qbp = new QueryBuilderParser( // provide here a list of allowable rows from the query builder. // NOTE: if a row is listed here, you will be able to create limits on that row from QBP. array( 'name', 'email' ) ); $query = $qbp->parse($input['querybuilder'], $table); $rows = $query->get(); return Response::JSON($rows);
这个查询在提交后会创建以下SQL查询
SELECT * FROM table_of_data_to_integrate WHERE `name` LIKE '%tim%' AND `email` LIKE '%@gmail.com'
从MongoDB获取结果
use timgws\QueryBuilderParser; $table = DB::collection('data'); $qbp = new QueryBuilderParser( // provide here a list of allowable rows from the query builder. // NOTE: if a row is listed here, you will be able to create limits on that row from QBP. array( 'name', 'email' ) ); $query = $qbp->parse($input['querybuilder'], $table); $rows = $query->get(); return Response::JSON($rows);
这个查询在提交后会创建以下MongoDB查询
{
"$and": [
{
"name": {
"$regex": "tim"
}
},
{
"email": {
"$regex": "@gmail\\.com$"
}
}
]
}
注意,要使用此功能,您需要安装和配置jenssegers/mongodb。
集成示例
与jQuery Datatables集成
与Datatables混合,jQuery QueryBuilder可以提供无限的数据过滤选项,并实时查看结果。
use timgws\QueryBuilderParser; class AdminUserController { function displayUserDatatable() { /* builder is POST'd by the datatable */ $queryBuilderJSON = Input::get('rules'); $show_columns = array('id', 'username', 'email_address'); $query = new QueryBuilderParser($show_columns); /** Illuminate/Database/Query/Builder $queryBuilder **/ $queryBuilder = $query->parse(DB::table('users')); return Datatable::query($queryBuilder) ->showColumns($show_columns) ->orderColumns($show_columns) ->searchColumns($show_columns) ->make() } }
在客户端,需要一点魔法来使一切工作。
// the default rules, what will be used on page loads... var datatablesRequest = {}; var _rules = defaultRules = {"condition":"AND","rules":[ {"id":"active","field":"active","type":"integer","input":"radio","operator":"equal","value":"1"} ]}; // a button/link that is used to update the rules. function updateFilters() { _rules = $('#querybuilder').queryBuilder('getRules'); reloadDatatables(); } function filterChange() { var _json = JSON.stringify( _rules ); datatablesRequest = { rules: _json }; } filterChange(); function reloadDatatables() { /* Datatables first... */ filterChange(); $('.dataTable').each(function() { dt = $(this).dataTable(); dt.fnDraw(); }) } jQuery(document).ready(function(){ // dynamic table oTable = jQuery('.datatable').dataTable({ "fnServerParams": function(aoData) { // add the extra parameters from the jQuery QueryBuilder to the Datatable endpoint... $.each(datatablesRequest , function(k,v){ aoData.push({"name": k, "value": v}); }) } }) });
使用JoinSupportingQueryBuilderParser
JoinSupportingQueryBuilderParser 是 QueryBuilderParser 的一个版本,它支持构建更复杂的查询。
$joinFields = array( 'join1' => array( 'from_table' => 'master', 'from_col' => 'm_col', 'to_table' => 'subtable', 'to_col' => 's_col', 'to_value_column' => 's_value', ), 'join2' => array( 'from_table' => 'master2', 'from_col' => 'm2_col', 'to_table' => 'subtable2', 'to_col' => 's2_col', 'to_value_column' => 's2_value', 'not_exists' => true, ) ); $table = DB::table('table_of_data_to_integrate'); $jsqbp = new JoinSupportingQueryBuilderParser($fields, $this->getJoinFields()); $test = $parser->parse($json, $builder);
这将构建一个类似于以下SQL查询
select * where exists (select 1 from `subtable` where subtable.s_col = master.m_col and `s_value` < ?)
对于简单查询,QueryBuilderParser 应该足够。
导出CSV文件
作为脚注,导出CSV文件有正确的方法和错误的方法。
对于正确的方法,请查看StackOverflow上的问题,如何输出Excel可以正确读取的UTF-8 CSV文件?
报告问题
我在多个项目中使用了此代码,所以如果您发现任何问题,请随时通过GitHub的bug tracker为此项目报告。
或者,您可以分支该项目并创建一个pull request :)
