Php Zend数据库对Where语句进行优先级排序

Php Zend数据库对Where语句进行优先级排序,php,mysql,sql,zend-framework,Php,Mysql,Sql,Zend Framework,我使用zend 1.12查询数据库以获得概述。现在我可以使用几个过滤器和一个搜索查询。这些问题都可以归结为一个查询,如下所示: SELECT `x`.`id`, `x`.`ref_id`, `x`.`start_date`, `x`.`regard`, `x`.`project_code`, `o`.`name` AS `contact`, `o`.`id` AS `contact_id`, `d`.`name` AS `department`, `c`.`name` AS `company`,

我使用zend 1.12查询数据库以获得概述。现在我可以使用几个过滤器和一个搜索查询。这些问题都可以归结为一个查询,如下所示:

SELECT `x`.`id`, `x`.`ref_id`, `x`.`start_date`, `x`.`regard`, `x`.`project_code`, `o`.`name` AS `contact`, `o`.`id` AS `contact_id`, `d`.`name` AS `department`, `c`.`name` AS `company`, `is`.`name` AS `status`, SUM(ip.price*ip.amount*(100-ip.discount)/100) AS `price_ex`, SUM(ip.price*ip.amount*(100-ip.discount)*(100+ip.tax)/10000)-IFNULL(p.payment,0) AS `price_open` FROM `invoice` AS `x`
 LEFT JOIN `contact` AS `o` ON x.recipient_id=o.id
 LEFT JOIN `department` AS `d` ON o.department_id=d.id
 LEFT JOIN `company` AS `c` ON d.company_id=c.id
 LEFT JOIN `invoice_status` AS `is` ON x.status=is.id
 LEFT JOIN `invoice_part` AS `ip` ON x.id=ip.invoice_id
 LEFT JOIN (SELECT SUM(amount) AS `payment`, `payment`.`invoice_id` FROM `payment` GROUP BY `invoice_id`) AS `p` ON x.id=p.invoice_id 
 WHERE (month(x.start_date) = '6') AND (year(x.start_date) = '2013') OR (LOWER(x.regard) LIKE '%test%') OR (LOWER(o.name) LIKE '%test%') OR (LOWER(c.name) LIKE '%test%') OR (LOWER(ref_id) LIKE '%test%') OR (LOWER(start_date) LIKE '%test%') GROUP BY `x`.`id` ORDER BY `x`.`updated_at` DESC LIMIT 50

现在所有的过滤器都添加了
,但是当我搜索一列时,它被添加为或,但是现在所有的东西都被找到了。我想做的是
[filter]和[filter]以及([search]或[search])
。是否可以在我的zend查询中添加这些
()

是的,只需将所有
位放入同一where调用中:

$select->where('MONTH(x.start_date) = ?', $start_date_month)
       ->where('YEAR(x.start_date) = ?', $start_date_year)
       ->where('LOWER(x.regard) LIKE ? OR LOWER(o.name) LIKE ? OR LOWER(c.name) LIKE ? OR LOWER(ref_id) LIKE ? OR LOWER(start_date) LIKE ?', array($search, $search, $search, $search, $search));

此外,MySQL字符串比较默认情况下不区分大小写,除非您使用了区分大小写的排序规则;因此
LOWER()
可能是不必要的(并且可能会阻止查询使用索引)。

我认为上面的问题应该会有所帮助。只是需要正确地构造它。thx看起来并没有真正的sql injetion保护,虽然我已经有一段时间没有在Zend上工作了,所以我不确定。当然,您可以自己引用部分查询-