文档章节

zf2 SQL where子句拼装

aidear
 aidear
发布于 2014/01/02 15:46
字数 482
阅读 107
收藏 2

zf2中where,可以灵活的组织sql条件语句,达到想要的结果。以下举例说明:

1 //在TableGateway子类中:
2 $select = $this->getSql()->select();
3 $where = $select->where;
4 $data['k'] = '关键词';
5 $where->like('UserName', '%' . $data['k'] . '%')->orPredicate(new Like('Email', '%' .$data['k'] . '%'))
6             ->orPredicate(new Like('Nick', '%' . $data['k'] . '%'))
7             ->orPredicate(new Like('Mobile', '%' . $data['k'] . '%'))
8             ->orPredicate(new Like('Address', '%' . $data['k'] . '%'));
9 $select->where($where);
10 $select->order(array('LastUpdate' => 'DESC'));


打印出来的sql:

1 SELECT member.* FROM member WHERE UserName LIKE '%关键词%' OR Email LIKE '%关键词%'OR Nick LIKE '%关键词%' OR Mobile LIKE '%关键词%' OR Address LIKE '%关键词%' ORDER BYLastUpdate DESC;

范围条件:

1 $where->greaterThan('Points', 10);
2 $where->or;//默认并的关系,此处声明为或的关系
3 $where->lessThanOrEqualTo('Points', 5);

SQL:

1 SELECT `member`.* FROM `member` WHERE `Points` > '10' OR `Points` <= '5';

另一种写法:

1 $where->greaterThan('Points', 10);
2 $where->orPredicate(new Zend\Db\Sql\Predicate\OperatorOperator('Points', '<=', 5));

SQL:

1 SELECT `member`.* FROM `member` WHERE `Points` > '10' OR `Points` <= '5';

where闭包:

1 $select->where(function($where){
2     $where->lessThan('id', 10);
3     $where->greaterThan('id', 5);
4     return $where;
5 })->order('id DESC')->limit(10);

SQL:

1 SELECT `member`.* FROM `member` WHERE `id` < '10' AND `id` > '5' ORDER BY `id` DESCLIMIT 10;

更复杂一点的,可以增加条件语句括号:

1 $select->where(function($where){
2  
3     $subWherePoints = clone $where;
4     $subWhereGender = clone $where;
5  
6     $subWherePoints ->lessThan('Points', 10);
7     $subWherePoints ->or;
8     $subWherePoints ->greaterThan('Points', 50);
9  
10     $where->addPredicate($subWherePoints );
11  
12     $subWhereGender ->equalTo('Gender', 1);
13     $subWhereGender ->or;
14     $subWhereGender ->equalTo('Gender', 2);
15     $where->addPredicate($subWhereGender);
16  
17     return $where;
18 });

SQL:

1 SELECT `member`.* FROM `member` WHERE (`Points` < '10' OR `Points` > '50') AND(`Gender` = '1' OR `Gender` = '2');

可以看到针对Points和Gender字段的筛选分别加上了括号,可以理解为针对两个字段的WHERE对象($subWherePoints, $subWhereGender)的拼接,此处如果使用一个where对象拼接,就没有这个效果了,除非使用string.

包含SQL函数的表达式:

1 $select->where(array(
2     'create_time' => new Zend\Db\Sql\Expression('NOW()')
3 ));

SQL:

1 SELECT `member`.* FROM `member` WHERE `create_time` = NOW();

本文转载自:http://1208.me/zf2-study-note-sql-where-use/

共有 人打赏支持
aidear
粉丝 0
博文 1
码字总数 0
作品 0
浦东
程序员
私信 提问
Android 内容提供器---内容提供器基础(从提供器中获取数据)

这一节使用用户字典提供器作为一个例子来描述了怎样从提供器中获取数据。 为了清晰起见,本节中的代码片段在UI线程上调用ContentResolver()方法,但是,在实际代码中,应该在一个独立的线程中...

长平狐
2012/10/16
154
0
Zend Framework 2.0 (zf2) 进阶数据库操作

首选的操作DB方式还是继承TableGateway,比如现在要操作的数据库为test,数据表为mydbtable,新建一个类如下 class MyDbTable extends ZendDbTableGatewayTableGateway { } 连接数据库驱动推...

块块
2013/04/02
0
1
YMP v2.0.3 发布,轻量级 Java 应用开发框架

YMP v2.0.3 发布了。本次版本主要是优化更新,新版本已提交至Maven中央库,可以通过以下配置获取各模块依赖: 请将替换为具体模块名,模块详见: The Central Repository Search Engine 本次更...

有理想的鱼
2017/11/03
1K
1
mybatis where语句动态拼装(if, foreach)

在 mapper 中写 sql 的时候,如果传入的参数两个以上,并且可能为空,就需要用到 where语句动态拼装了。 使用 where语句,if 标签进行拼装,如果某项参数为空, 此项就会略去;如果不为空,此...

imbiao
09/11
0
0
Zend Framework 2.0 正式版发布及新功能介绍

著名php开源框架Zend Framework经历了长达数年的开发,终于在2012年9月5日正式发布了2.0版本,下简称ZF2。时隔Zend 1.0版本的发布已经有5年之久。php的框架一直都是百家争鸣的,但是作为php...

今天星期一
2012/09/07
7.8K
24

没有更多内容

加载失败,请刷新页面

加载更多

如何很绅士的使用线程池

前言 平时接触过多线程开发的童鞋应该都或多或少了解过线程池,之前发布的《阿里巴巴 Java 手册》里也有一条: 可见线程池的重要性。 简单来说使用线程池有以下几个目的: 线程是稀缺资源,不...

瑞查德-Jack
13分钟前
2
0
Java开发必会的Linux命令

1.查找文件find / -name filename.txt 根据名称查找/目录下的filename.txt文件。find . -name "*.xml" 递归查找所有的xml文件find . -name "*.xml" |xargs grep "hello world" 递归...

奥特曼之王
15分钟前
3
0
【 58沈剑 架构师之路】各种SQL到底加了什么锁?

有朋友留言:你TM讲了这么多,锁分了这么多类型,又和事务隔离级别相关,又和索引相关,究竟能不能直接告诉我,一个SQL到底加了什么锁!? 我竟无言以对。 好吧,做过简单梳理之后,今天尝试...

张锦飞
17分钟前
2
0
打包 压缩 命令tar zip

打包 压缩 命令tar zip tar语法 #压缩 tar -czvf ***.tar.gz tar -cjvf ***.tar.bz2 #解压缩 tar -xzvf ***.tar.gz tar -xjvf ***.tar.bz2  tar [主选项+辅选项] 文件或目录 主选项是必须要...

linjin200
22分钟前
1
0
使用form表单同时实现上传文件和提交文本数据

使用form表单同时实现上传文件和提交文本数据,此示例中在后台将文件上传到阿里的oss存储服务器中 申请oss相关账号: endpoint = "http://oss-cn-qingdao.aliyuncs.com"; accessKeyId = "key"...

貔貅叔
28分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部