lachlanhickey / query-builder-parser
使用jQuery-QueryBuilder时,自动构建复杂的Eloquent & QueryBuilder查询
1.6.1
2021-02-03 06:31 UTC
Requires
- illuminate/database: ^8.0||^7.0||^6.0||4.1 - 6.0
Requires (Dev)
- mockery/mockery: ^1.3.1||^0.9.4
- phpunit/phpunit: ^8.5||^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上的问题,如何输出UTF-8 CSV,Excel可以正确读取?
报告问题
我在多个项目中使用此代码,所以如果您发现任何问题,请随时通过GitHub的bug tracker为此项目报告问题。
或者,fork此项目并提交pull request :)