markjaquith/wherewithal

给定约束,将条件字符串解析为有效的MySQL WHERE子句

0.1.1 2021-03-11 03:06 UTC

This package is auto-updated.

Last update: 2024-09-12 13:22:11 UTC


README

给定约束,将条件字符串解析为有效的MySQL WHERE子句

Tests

安装

composer require markjaquith/wherewithal

使用方法

use MarkJaquith\Wherewithal\{Parser, Config};

$config = (new Config)
	->addOperators('<', '>', '<=', '>=', '=', '/') // Or add a subset.
	->addColumn('column_name', 'column_alias1', 'column_alias2')
	->addColumn('quantity')
	->addColumn('price', 'cost');

$parser = new Parser($config);

$structure = $parser->parse('quantity > 5 and (price < 3.00 or column_alias2 = 10'));

$structure->toString();
/*
  string(57) "quantity > ? and ( price < ? or price / column_name = ? )"
*/

$structure->getBindings()]);
/*
  array(3) {
    [0]=>
    string(1) "5"
    [1]=>
    string(4) "3.00"
    [2]=>
    string(2) "10"
  }
*/

您还可以将简单的列名映射到复杂的表达式,如下所示

$structure->mapColumns(function($col) {
	return [
		'column_name' => '`some_long_table_name`.`long_column_name`',
	]($col) ?? $col;
})->toString();
/*
	string(92) "(`some_long_table_name`.`long_column_name`) > ? and ( price < ? or price / column_name = ? )"
*/

未在配置中添加的列将被假定是值。值始终使用占位符 ?

您应使用数据库层组合生成的 WHERE(或 HAVING)子句。以下是在Laravel中如何操作的示例

$orders = DB::table('orders')
	->whereRaw($structure->toString(), $structure->getBindings())
  ->get();