2010-01-11 58 views
2

我需要创建一个GUI,使用它可以选择用于查询数据库以查找合适人员的几个属性。我正在寻找如何根据用户的选择动态生成数据库查询的想法。如何根据用户的选择动态生成SQL查询?

查询将包含几个字段,但得到的想法,我会包括只有三个低于为例:

  • 职业 - 可以有0到n职业字符串。如果给出职业字符串,其中一个必须匹配。

  • 年龄 - 年龄可被给定为:

    1. 精确匹配(30)
    2. 范围(例如30-40)
    3. 比的值(-40)
    4. 少超过一个值(30-)

年龄参数在查询中是可选的。另外,用户可以指定年龄是否是必需的参数。如果不是必需的,并且一个人没有年龄是他/她的个人资料,那么这个人将忽略年龄标准。

  • 高度 - 年龄相似

查询示例:

没有标准已经给出:

select * from persons 

唯一的占领已经给出:

select * from persons where occupation = 'dentist' 

一些职业被赋予了:

select * from persons where (occupation = 'dentist' or occupation = 'engineer') 

年龄已经给出一个大于价值,而且它需要在个人资料存在:

select * from persons where age >= 30 

身高已经给出了作为并且不需要存在于人的简档上:

select * from persons where (height is null or (height >= 30 and height <= 40)) 

Combina不同的标准:

select * from persons where occupation = 'dentist' and age >= 30 and (height is null or (height >= 30 and height <= 40)) 

我已经实现了能够生成查询作为字符串的代码,但它肯定不是太漂亮。我正在寻找想法什么是最有效和最漂亮的方式来实现这一点。

回答

3

尝试类似Zend_Db_Select。它提供了一个(流利)接口,用于生成查询并处理为你创建的语法,例如

$select = $db->select(); 
$select->from(/* ...specify table and columns... */) 
     ->where(/* ...specify search criteria... */) 
     ->where(/* ...specify other criteria... */) 
     ->order(/* ...specify sorting criteria... */); 

我不得不在用户有包含在数据库中自动应用到某些表的过滤条件,从而限制该配置文件中的一个我最近的项目类似的要求是什么用户都可以看到,如限制固定客户的产品,但仍允许通过GUI动态过滤,例如对于产品类别。

我解决它通过让我的模型返回一个基本的查询,然后通过将应用用户拥有所有的标准在他的配置装饰器运行此基本查询,所以例如(虚假代码)。

request = Request->getParams()   // selection criteria set from GUI 
    sql  = Products->getBaseQuery(request) // basic query for requested View 
    sql  = Decorator->applyUserConfig(sql) // custom fixed user filter 
    results = sql->execute() 
2

这不会直接回答你的问题,但在这里是你一个小秘密,而不是写你这样的查询:

select * from persons where (occupation = 'dentist' or occupation = 'engineer') 

试试这个:

select * from persons where occupation IN ('dentist','engineer') 

这种情况很容易阅读并轻松让您的PHP脚本生成。

0

看起来你有可以生成的有限数量的查询,所以我建议用参数写这些,然后使用选择逻辑来确定调用哪个参数值并设置参数值。