在XOOPS中,当取得某些满足特定条件的数据的时候就需要使用一些过滤条件。比如取得前30行已经发布的文章。
Criteria类及其相关类就是起这个作用的,通过使用它们,你可以方便地构造各种条件。
在英文中,Criteria是criterion的复数,criterion的意思是“标准,准则,尺度 ”。还有一个词“Compo”,是合成物的意思,稍后用到。
Criteria的用法
首先初始化一个CriteriaCompo,用来装载这些查询条件:
$criteria = new CriteriaCompo();
增加查询条件:
//id等于5 |
$criteria->add(new Criteria(‘id‘, ‘5‘)); |
//id大于10 |
$criteria->add(new Criteria(‘id‘, ‘10‘, ‘>‘)); |
很方便吧,每一个Criteria实例就是一个查询条件,下面我们分析一下参数。
Criteria($column, $value = ‘‘, $operator = ‘=‘, $prefix = ‘‘, $function = ‘‘)
$column:要操作的字段名称。
$value:字段满足的值。
$operator:操作符,比如 = , > , < , <= , >= , IN , NOT IN等。
$prefix:表前缀,稍后在例子中可以看到效果。
$function:要对字段进行的MySQL函数操作,比如md5()。
知道了参数,那么下面我们再看一个例子(xoops_是全局的表前缀):
$criteria->add(new Criteria(‘hash‘, ‘10‘, ‘=‘, ‘xoops_info_info‘, ‘md5(%s)‘));
产生的SQL语句是:
SELECT * FROM `info_info` WHERE (md5(info_info.hash) = ‘10‘)
我们先忽略info_info表示什么东西,也忽略这个SQL语句的不合逻辑性。单单从参数上看应该就可以理解这几个参数的意义了。
其他的条件:
$criteria->setStart(0); //从满足条件的第0条记录开始 |
$criteria->setLimit(10); //提取10条记录 |
$criteria->setGroupby(‘category‘); //按照category字段分组 |
$criteria->setSort(‘weight‘); //按照weight字段排序 |
$criteria->setOrder(‘ASC‘); //排序是由小到大的顺序 |
如果你明白基本的MySQL,那么你应该很容易明白以上的语句是什么意思。
综合例子
说了这么多,我们将以上的代码合起来看看效果吧。提醒,请不要理会生成的SQL的逻辑错误,只要关心这些函数把他们的参数放到了SQL语句的什么地方。
PHP代码
$infoHandler = xoops_getmodulehandler(‘info‘); |
$criteria = new CriteriaCompo(); |
$criteria->add(new Criteria(‘id‘, ‘5‘, ‘>‘)); |
$criteria->add(new Criteria(‘id‘, ‘10‘, ‘<‘, ‘xoops_info_info‘, ‘md5(%s)‘)); |
$criteria->setStart(0); |
$criteria->setLimit(10); |
$criteria->setGroupby(‘category‘); |
$criteria->setSort(‘weight‘); |
$criteria->setOrder(‘ASC‘); |
$infos = $infoHandler->getAll($criteria); |
SELECT * FROM `info_info` WHERE (id > ‘5‘ AND
md5(info_info.id) < ‘10‘) ORDER BY weight ASC LIMIT 0, 10
在这里,groupby条件没有能显现出来。这个问题如果你精通SQL,就会理解。以后我们再探讨这个SQL。还有上面的代码的第一行和尾行我们会在下一篇中继续分析。modulehandler是十分强大的!
怎么没有贴源代码
以前,我分析xoops的时候,总是贴上一大段的xoops源代码。而这次,我主要从使用方面上来分析,并没有粘贴源代码。主要原因是:
- 这样可能更清晰
- 这样节省篇幅
- 我本人也不知道那种形式更好,如果你看到了这一行文字,请在看完之后花费30秒的时候给我写点评论。写出你认为写法中的不足,或者你喜欢文章中的那一部分,以便我以后改进!因为以后会有更多的XOOPS分析,你也不希望我写出一堆你不懂的东西吧。
需要进一步了解Criteria的XOOPSer应该去看看源代码。这个文件在:class/criteria.php。你会发现很多有用的代码!