zf2完全重写了Zend1的数据库组件,但是目前手册给的例子都弱爆了,只能自己整理一些Zend/Db/TableGateway用例如下:VBQHTML5中文学习网 - HTML5先行者学习网
首选的操作DB方式还是继承TableGateway,比如现在有一个posts表需要操作,新建一个类如下VBQHTML5中文学习网 - HTML5先行者学习网
class Posts extends Zend/Db/TableGateway/TableGatewayVBQHTML5中文学习网 - HTML5先行者学习网
{VBQHTML5中文学习网 - HTML5先行者学习网
}VBQHTML5中文学习网 - HTML5先行者学习网
实例化这个类并传入Zend/Db/Adapter/Adapter即可连接数据库,此处并非重点,假设实例化后的TableGateway为$postTable,我们需要这样操作posts表:VBQHTML5中文学习网 - HTML5先行者学习网
WHERE 链式操作VBQHTML5中文学习网 - HTML5先行者学习网
zf2推荐的查询方式为链式操作VBQHTML5中文学习网 - HTML5先行者学习网
$select = $postTable->getSql()->select();VBQHTML5中文学习网 - HTML5先行者学习网
$select->where('id > 5')->order('id DESC')->limit(10);VBQHTML5中文学习网 - HTML5先行者学习网
$resultSet = $postTable->selectWith($select);VBQHTML5中文学习网 - HTML5先行者学习网
$result = $resultSet->toArray();VBQHTML5中文学习网 - HTML5先行者学习网
WHERE 闭包操作VBQHTML5中文学习网 - HTML5先行者学习网
zf2还支持闭包式的操作,上例可以以闭包方式改写成:VBQHTML5中文学习网 - HTML5先行者学习网
VBQHTML5中文学习网 - HTML5先行者学习网
$select = $postTable->getSql()->select();VBQHTML5中文学习网 - HTML5先行者学习网
$select->where(function($where){VBQHTML5中文学习网 - HTML5先行者学习网
$where->lessThan('id', 10);VBQHTML5中文学习网 - HTML5先行者学习网
$where->greaterThan('id', 5);VBQHTML5中文学习网 - HTML5先行者学习网
return $where;VBQHTML5中文学习网 - HTML5先行者学习网
})->order('id DESC')->limit(10);VBQHTML5中文学习网 - HTML5先行者学习网
WHERE AND复合条件VBQHTML5中文学习网 - HTML5先行者学习网
而当where条件为复合条件时,可以这样写:VBQHTML5中文学习网 - HTML5先行者学习网
VBQHTML5中文学习网 - HTML5先行者学习网
$select->where(VBQHTML5中文学习网 - HTML5先行者学习网
array('id > 30')VBQHTML5中文学习网 - HTML5先行者学习网
)->where(VBQHTML5中文学习网 - HTML5先行者学习网
array('id < 10')VBQHTML5中文学习网 - HTML5先行者学习网
);VBQHTML5中文学习网 - HTML5先行者学习网
VBQHTML5中文学习网 - HTML5先行者学习网
将会生成以下SQLVBQHTML5中文学习网 - HTML5先行者学习网
SELECT "posts".* FROM "posts" WHERE id > 30 AND id < 10;VBQHTML5中文学习网 - HTML5先行者学习网
WHERE OR 复合条件VBQHTML5中文学习网 - HTML5先行者学习网
如果要将Where查询的默认链接为AND,如果想要更改为OR,可以这样写:VBQHTML5中文学习网 - HTML5先行者学习网
VBQHTML5中文学习网 - HTML5先行者学习网
$select->where(VBQHTML5中文学习网 - HTML5先行者学习网
array('id > 30')VBQHTML5中文学习网 - HTML5先行者学习网
)->where(VBQHTML5中文学习网 - HTML5先行者学习网
array('id < 10'), /Zend/Db/Sql/Where::OP_ORVBQHTML5中文学习网 - HTML5先行者学习网
);VBQHTML5中文学习网 - HTML5先行者学习网
SQL:VBQHTML5中文学习网 - HTML5先行者学习网
SELECT "posts".* FROM "posts" WHERE id > 30 OR id < 10;VBQHTML5中文学习网 - HTML5先行者学习网
还可以这样写,效果是一样。这是通过魔术方法__call()实现的。VBQHTML5中文学习网 - HTML5先行者学习网
$where = $select->where;VBQHTML5中文学习网 - HTML5先行者学习网
$where->lessThan('id', 10);VBQHTML5中文学习网 - HTML5先行者学习网
$where->or;VBQHTML5中文学习网 - HTML5先行者学习网
$where->greaterThan('id', 30);VBQHTML5中文学习网 - HTML5先行者学习网
VBQHTML5中文学习网 - HTML5先行者学习网
WHERE 复杂条件VBQHTML5中文学习网 - HTML5先行者学习网
如果查询条件进一步复杂,比起链式操作来,闭包操作更具有灵活性,比如:VBQHTML5中文学习网 - HTML5先行者学习网
$select->where(function($where){VBQHTML5中文学习网 - HTML5先行者学习网
$subWhereForId = clone $where;VBQHTML5中文学习网 - HTML5先行者学习网
$subWhereForTitle = clone $where;VBQHTML5中文学习网 - HTML5先行者学习网
$subWhereForId->lessThan('id', 10);VBQHTML5中文学习网 - HTML5先行者学习网
$subWhereForId->or;VBQHTML5中文学习网 - HTML5先行者学习网
$subWhereForId->greaterThan('id', 20);VBQHTML5中文学习网 - HTML5先行者学习网
$where->addPredicate($subWhereForId);VBQHTML5中文学习网 - HTML5先行者学习网
$subWhereForTitle->equalTo('title', 'a');VBQHTML5中文学习网 - HTML5先行者学习网
$subWhereForTitle->or;VBQHTML5中文学习网 - HTML5先行者学习网
$subWhereForTitle->equalTo('title', 'b');VBQHTML5中文学习网 - HTML5先行者学习网
$where->addPredicate($subWhereForTitle);VBQHTML5中文学习网 - HTML5先行者学习网
return $where;VBQHTML5中文学习网 - HTML5先行者学习网
});VBQHTML5中文学习网 - HTML5先行者学习网
等同于SQLVBQHTML5中文学习网 - HTML5先行者学习网
SELECT "posts".* FROM "posts" WHERE ("id" < '10' OR "id" > '20') AND ("title" = 'a' OR "title" = 'b');VBQHTML5中文学习网 - HTML5先行者学习网
VBQHTML5中文学习网 - HTML5先行者学习网
EvaEngine的改进VBQHTML5中文学习网 - HTML5先行者学习网
在EvaEngine中,可以使用完整的链操作,最开始的例子在EvaEngine里可以这样写:VBQHTML5中文学习网 - HTML5先行者学习网
$result = $postTable->where('id > 5')->order('id DESC')->limit(10)->find();VBQHTML5中文学习网 - HTML5先行者学习网
原文地址:http://avnpc.com/pages/advanced-database-select-usage-in-zf2VBQHTML5中文学习网 - HTML5先行者学习网
VBQHTML5中文学习网 - HTML5先行者学习网VBQHTML5中文学习网 - HTML5先行者学习网