kohana数据库查询器.docx
- 文档编号:9790210
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:12
- 大小:19.69KB
kohana数据库查询器.docx
《kohana数据库查询器.docx》由会员分享,可在线阅读,更多相关《kohana数据库查询器.docx(12页珍藏版)》请在冰豆网上搜索。
kohana数据库查询器
Kohana数据库查询器
使用查询器方法无关数据库查询和数据操作。
用法
首先实例化数据库类
//如果你的类继承自模型,$this->db已经声明。
//此列就不行了
$this->db=newDatabase();
//组建查询条件:
$this->db->from('users');
$this->db->select('username');
$this->db->where('id',1);
//上面的查询器相当于SQL语句:
'SELECTusernameFROMusersWHEREid=1'
执行get(),insert(),update(),delete()方法来查询结果:
$result=$this->db->get();
//上下两个结果$result返回的结果是一样的:
$result=$this->db->query('SELECTusernameFROMusersWHEREid=1');
所有的查询器方法返回的都是Database类,所以你可以使用串联方法:
$result=$this->db->from('users')->select('username')->where('id',1)->get();
局限性
当数据库类的查询器部分非常强大和易于使用,但它的确有一些局限性。
最主要的原因在于它会对输入项进行转义。
因此下面的事情不会正常工作:
1.数据库中的计算:
$db→update('pages',array('views'⇒'views+1'))。
由于会对输入值进行转义,所以它无法计算得出结果。
2.圆括号支持:
比如SELECT*FROMpagesWHERE(id=5)OR(title=“BLAH”ANDid=15)不会正常工作,因为查询器没有能力识别圆括号。
这个特性将会在未来的版本中解决。
3.任何数据库内置特殊函数:
比如MySQL'sNOW()汉化将会进行转义而不能正常工作。
在未来的版本中将会有一个选项可以设置自动关闭查询转义功能。
解决这个问题又两个关联的问题。
这对原因导致我们目前无法支持:
∙如果查询器要支持服务器的无关数据库访问。
在你的查询器中加入DB指定函数声明会导致完全破坏掉这点。
∙对每个数据库服务器来说有太多的函数需要支持,而且对于还有检查所有功能的可用性。
Kohana专注于速度,所以有时必须进行取舍。
∙引用是必须为表/列明去发挥最大的灵活性。
方法
select()
select()方法可以选择查询你想要的表结构的名称。
$db=newDatabase();
$db->select('id,title');
//或者
$db->select(array('id','title'));
这是查询选择表中的`id`,`title`字段。
注意查询器会自动为你转义列名。
且如果你没有使用此方法的话,你的查询会自动设置为“SELECT*”。
你也可以进行多表查询:
$db->select('users.id,pages.title');
转换为SQL语句:
SELECT`users`.`id`,`pages`.`title`
您还可以指定列别名:
$db->select('idaspage_id','titleaspage_title');
转换为SQL语句:
SELECT`id`AS`page_id`,`title`AS`page_title`
获取DISTINCTdata:
$db->select('DISTINCTuser')
转换为SQL语句:
SELECTDISTINCT`user`
from()
from()方法设置你想从哪个表选择。
你可以使用数组方式或者逗号分隔输入表名。
$db->from('pages');
//或者
$db->from(array('pages','users'));
转换为SQL就是:
“FROM`pages`,`users`”。
注意查询器会自动为你转义输入值。
你也可以指定表别名就像上面的select()方法。
where()
where()方法设置查询语句中的条件。
通过传递列名和值完成一个条件,或者通过数组方式传递多个列明和值。
系统会使用AND连接他们。
$db->where('id',5);
$db->where(array('id'=>5));
$db->where(array('id'=>5,'title'=>'Demo'));
SQL语句:
WHERE`id`=5AND`title`=“Demo”
wherenot
$db->where(array('id!
='=>$some_id));
更多操作
$db->where(array('id>='=>$some_id));
$db->where(array('id<'=>$some_id));
//...等等
isnull
$db->where('colnameISNULL');
//OR...
$db->where(array('colname'=>null));
orwhere()
同上面的方法,与上面不同的的是,它使用的是OR连接。
$db->orwhere(array('id'=>5,'title'=>'Demo'));
SQL语句:
WHERE`id`=5OR`title`=“Demo”
like()
和where()方法相同,只不过把WHERE用LIKE替换:
$db->like('title','Demo');
SQL语句:
WHERE`title`LIKE”%Demo%”
你也可以手动添加你想要的方式:
$db->like('title','%Demo');
$db->like('title','Demo%');
当然,使用数组方式同样也可以实现。
但数组之间使用的AND连接:
$db->like(array('title'=>'Demo','subtitle'=>'Start'));
SQL语句:
WHERE`title`LIKE”%Demo%”AND`subtitle`LIKE”%Start%”
orlike()
和like()方法相同,只不过它使用OR连接:
$db->orlike(array('title'=>'Demo','subtitle'=>'Start'));
SQL语句:
WHERE`title`LIKE”%Demo%”OR`subtitle`LIKE”%Start%”
notlike()
和like()方法相同,但它是以NOTLIKE连接:
$db->notlike('title'=>'Demo');//SQL语句:
"WHERE`title`NOTLIKE"%Demo%""
$db->notlike(array('title'=>'Demo','subtitle'=>'Start'));//SQL语句:
"WHERE`title`NOTLIKE"%Demo%"AND`subtitle`NOTLIKE"%Start%""
ornotlike()
和like()方法相同,但它是以ORNOTLIKE连接:
$db->ornotlike(array('title'=>'Demo','subtitle'=>'Start'));//SQL语句:
"WHERE`title`NOTLIKE"%Demo%"OR`subtitle`NOTLIKE"%Start%""
in()
创建IN条件查询。
它有三个参数:
1.匹配的列
2.一个数组或字符串值相比配
3.(boolean),创建一个NOT从句代替
$db->in('title',array(1,2,3,4,5));
SQL语句:
`title`IN('1','2','3','4','5')
notin()
和in()方法相同,但它是以NOTIN从句代替。
你也使用这个方法(两个参数)或者使用in()并设置第三个参数为TRUE。
$db->notin('title',array(1,2,3,4,5));
//或者
$db->in('title',array(1,2,3,4,5),TRUE);
SQL语句:
`title`NOTIN('1','2','3','4','5')
regex()
此方法允许你使用正则表达式去搜索。
其语法和like()方法相同。
$db->regex('title','Demo|Sample');
$db->regex(array('title'=>'Demo|Sample'));
orregex()
和regex()方法相同,但它使用OR连接多个从句。
notregex()
和regex()方法相同,但它使用NOTREGEX连接多个从句。
ornotregex()
和regex()方法相同,但它使用ORNOTREGEX连接多个从句。
groupby()
创建GROUPBY语句查询。
你可以传递字符串或数组。
$db->groupby('title');
$db->groupby(array('title','id'));
having()
创建HAVING语句查询。
其语法和like()方法相同。
$db->having('title','Demo');
orhaving()
和having()方法相同。
但它使用OR连接多个从句。
get()
执行目前的查询器报表。
它有三个参数:
1.设置表名
2.设置limit
3.如果设置位移,可以设置偏移量
在执行此语句之后返回一个对象型的数据库结果。
$query=$db->from('pages')->where(array('id>='=>5))->get();
//等同于
$query=$db->where(array('id>='=>5))->get('pages');
getwhere()
和上面方法相同,只不过它的参数为:
1.设置表名
2.设置where条件
3.设置limit
4.如果设置位移,可以设置偏移量
那么,下面的例子和上面的还是相同的:
$query=$db->getwhere('pages',array('id>='=>5));
set()
为插入创建SET语句。
你可以传递一个或两个参数:
$db->set('column','value');
//或者
$db->set(array('column'=>'value'));
merge()
执行合并查询。
此方法的行为会影响并改变正在使用的后端数据库。
在MySQL数据库中,例如,数据库搜索一个存在的列,如果存在就删除此行,在插入新的一行。
此语法类似于更新(update)。
insert()
进行数据库插入查询。
这个方法有两个参数
1.一个是要插入的表
2.一个是要插入的关联列数组和他们的值
$status=$db->insert('pages',array('title'=>'Mynewtitle'));
//计算有多少行要插入
$rows=count($status);
返回一次查询结果(和你用“Database:
:
query())”返回的对象是一样的)
如果您有在另一个查询器方法设置它的话,你也可以您也可以省略所有参数:
$db->from('pages')->set(array('title'=>'Mynewtitle'))->insert();
update()
执行数据库更新查询。
它有三个参数:
1.需要更新的表名。
2.关联数组的列和它们新值。
3.WHERE语句的更新。
既可以是字符串也可以是关联数组。
详细请查询where()方法。
$status=$db->update('pages',array('title'=>'Mynewtitle'),array('id'=>5));
//返回多少列更新的计数
$rows=count($status);
如果您用另一个查询器方法设置它的话,您也可以省略所有参数:
$db->from('pages')->set(array('title'=>'Mynewtitle'))->where(array('id'=>5))->update();
必须注意的是,上述方法只能用于在没有表前缀的情况下。
如果有表前缀,例如prefix_pages,那么会出错,请使用下列方法之一
$db->set(array('title'=>'Mynewtitle'))->where(array('id'=>5))->update('pages');//将表名放到update语句里
//or
$db->from('pages')->set(array('title'=>'Mynewtitle'))->where(array('id'=>5))->update('pages');//from和update均添加表名
delete()
执行删除数据库中的数据。
它有2个参数:
1.需要删除的表名。
2.WHERE语句的删除条件。
这个既可以是字符串也可以是数组。
详情请查看where()方法。
$status=$db->delete('pages',array('id'=>5));
//返回删除列的计数
$rows=count($status);
您还可以设置表并用查询器的insert()方法和update()放在WHERE语句上面。
offset()
创建查询的偏移量。
这会导致记录开始在不同的起点。
//设置开始偏移量为10。
$db->offset(10);
limit()
创建限制部分查询。
第一个参数你要查询限制的结果数量。
你也可以在这个方法设置偏移(offset)做第二个参数:
//限制查询15条记录
$db->limit(15);
//或者
//从偏移量10开始限制查询15条记录
$db->limit(15,10);
orderby()
根据指定的查询进行结果排序。
它有两个参数:
1.排序的字段(也可以使用数组设置多个字段)
2.排序的方式(默认是ASC)
$db->orderby('title','ASC');
你也可以使用下面针对Mysql数据的代码进行随机排序:
$db->orderby(NULL,'RAND()');
orderby()方法也支持多字段排序,如果你设置的是数组形式。
$db->orderby(array('id'=>'ASC','date_created'=>'ASC'));
join()
连接两个表。
1.string-要连接的表名
2.string/array-where键名或键名⇒值形式的数组
3.string-where值
4.string-连接类型-LEFT,RIGHT,OUTER,INNER,LEFTOUTER,RIGHTOUTER
//执行查询连接user_roles表
$db->from('users_roles');
//把roles连接到user_roles
$db->join('roles','roles.id','users_roles.role_id');
//执行查询
$db->get();
同样可以使用数组语法的join:
$this->db->join('roles',array('roles.id'=>'users_roles.role_id'));
count_records()
查询记录的计数值。
1.string-表名
2.array-where语句
//所有用户的计数值
$count=$db->count_records('users');
//禁止(banned)用户的计数值
$banned_users_count=$db->count_records('users',array('banned'=>1));
//或者这样使用
$banned_users_count=$db->where('banned',1)->count_records('users');
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- kohana 数据库 查询