1、kohana数据库查询器Kohana 数据库查询器使用查询器方法无关数据库查询和数据操作。 用法首先实例化数据库类 /如果你的类继承自模型,$this-db 已经声明。/此列就不行了$this-db = new Database();/组建查询条件:$this-db-from(users);$this-db-select(username);$this-db-where(id,1);/上面的查询器相当于 SQL 语句:SELECT username FROM users WHERE id = 1执行 get(),insert(),update(),delete() 方法来查询结果: $resu
2、lt = $this-db-get();/上下两个结果 $result 返回的结果是一样的:$result = $this-db-query(SELECT username FROM users WHERE id = 1);所有的查询器方法返回的都是 Database 类,所以你可以使用串联方法: $result = $this-db-from(users)-select(username)-where(id,1)-get();局限性当数据库类的查询器部分非常强大和易于使用,但它的确有一些局限性。最主要的原因在于它会对输入项进行转义。因此下面的事情不会正常工作: 1. 数据库中的计算:$dbu
3、pdate(pages, array(views views+1)。由于会对输入值进行转义,所以它无法计算得出结果。2. 圆括号支持:比如 SELECT * FROM pages WHERE (id = 5) OR (title = “BLAH” AND id = 15) 不会正常工作,因为查询器没有能力识别圆括号。这个特性将会在未来的版本中解决。3. 任何数据库内置特殊函数:比如 MySQLs NOW() 汉化将会进行转义而不能正常工作。在未来的版本中将会有一个选项可以设置自动关闭查询转义功能。解决这个问题又两个关联的问题。这对原因导致我们目前无法支持: 如果查询器要支持服务器的无关数据库访
4、问。在你的查询器中加入 DB 指定函数声明会导致完全破坏掉这点。 对每个数据库服务器来说有太多的函数需要支持,而且对于还有检查所有功能的可用性。Kohana 专注于速度,所以有时必须进行取舍。 引用是必须为表/列明去发挥最大的灵活性。方法select()select() 方法可以选择查询你想要的表结构的名称。 $db = new Database();$db-select(id, title);/ 或者$db-select(array(id, title);这是查询选择表中的 id,title字段。注意查询器会自动为你转义列名。且如果你没有使用此方法的话,你的查询会自动设置为“SELECT *
5、”。你也可以进行多表查询: $db-select(users.id, pages.title);转换为 SQL 语句:SELECT users.id, pages.title 您还可以指定列别名: $db-select(id as page_id, title as page_title);转换为 SQL 语句:SELECT id AS page_id, title AS page_title 获取 DISTINCT data: $db-select(DISTINCT user) 转换为 SQL 语句: SELECT DISTINCT user from()from() 方法设置你想从哪个表选
6、择。你可以使用数组方式或者逗号分隔输入表名。 $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 = Dem
7、o);SQL 语句:WHERE id = 5 AND title = “Demo” where not$db-where(array(id != = $some_id);更多操作$db-where(array(id = = $some_id); $db-where(array(id $some_id); / . 等等is null$db-where(colname IS NULL);/ OR.$db-where(array(colname = null);orwhere()同上面的方法,与上面不同的的是,它使用的是 OR 连接。 $db-orwhere(array(id = 5, title
8、= Demo);SQL 语句:WHERE id = 5 OR 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
9、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() 方法相同,但它是以 NOT LIKE 连接: $db-notlike(title = Demo); / SQL 语句:WHERE title NOT LIKE %Demo%$db
10、-notlike(array(title = Demo, subtitle = Start); / SQL 语句:WHERE title NOT LIKE %Demo% AND subtitle NOT LIKE %Start%ornotlike()和 like() 方法相同,但它是以 OR NOT LIKE 连接: $db-ornotlike(array(title = Demo, subtitle = Start); / SQL 语句:WHERE title NOT LIKE %Demo% OR subtitle NOT LIKE %Start%in()创建 IN 条件查询。它有三个参数:
11、 1. 匹配的列2. 一个数组或字符串值相比配3. (boolean),创建一个 NOT 从句代替$db-in(title, array(1,2,3,4,5);SQL 语句:title IN (1,2,3,4,5) notin()和 in() 方法相同,但它是以 NOT IN 从句代替。你也使用这个方法(两个参数)或者使用 in() 并设置第三个参数为 TRUE。 $db-notin(title, array(1,2,3,4,5);/ 或者$db-in(title, array(1,2,3,4,5), TRUE);SQL 语句:title NOT IN (1,2,3,4,5) regex()此
12、方法允许你使用正则表达式去搜索。其语法和 like() 方法相同。 $db-regex(title, Demo|Sample);$db-regex(array(title = Demo|Sample);orregex()和 regex() 方法相同,但它使用 OR 连接多个从句。 notregex()和 regex() 方法相同,但它使用 NOT REGEX 连接多个从句。 ornotregex()和 regex() 方法相同,但它使用 OR NOT REGEX 连接多个从句。 groupby()创建 GROUP BY 语句查询。你可以传递字符串或数组。 $db-groupby(title);
13、$db-groupby(array(title, id);having()创建 HAVING 语句查询。其语法和 like() 方法相同。 $db-having(title, Demo);orhaving()和 having() 方法相同。但它使用 OR 连接多个从句。 get()执行目前的查询器报表。它有三个参数: 1. 设置表名2. 设置 limit3. 如果设置位移,可以设置偏移量在执行此语句之后返回一个对象型的数据库结果。 $query = $db-from(pages)-where(array(id = = 5)-get();/ 等同于$query = $db-where(array
14、(id = = 5)-get(pages);getwhere()和上面方法相同,只不过它的参数为: 1. 设置表名2. 设置 where 条件3. 设置 limit4. 如果设置位移,可以设置偏移量那么,下面的例子和上面的还是相同的: $query = $db-getwhere(pages, array(id = = 5);set()为插入创建 SET 语句。你可以传递一个或两个参数: $db-set(column, value);/ 或者$db-set(array(column = value);merge()执行合并查询。此方法的行为会影响并改变正在使用的后端数据库。 在 MySQL 数据
15、库中,例如,数据库搜索一个存在的列,如果存在就删除此行,在插入新的一行。此语法类似于更新(update)。 insert()进行数据库插入查询。这个方法有两个参数 1. 一个是要插入的表2. 一个是要插入的关联列数组和他们的值$status = $db-insert(pages, array(title = My new title);/ 计算有多少行要插入$rows = count($status);返回一次查询结果(和你用“Database:query()”返回的对象是一样的) 如果您有在另一个查询器方法设置它的话,你也可以您也可以省略所有参数: $db-from(pages)-set(a
16、rray(title = My new title)-insert();update()执行数据库更新查询。它有三个参数: 1. 需要更新的表名。2. 关联数组的列和它们新值。3. WHERE语句的更新。既可以是字符串也可以是关联数组。详细请查询 where() 方法。$status = $db-update(pages, array(title = My new title), array(id = 5);/ 返回多少列更新的计数$rows = count($status);如果您用另一个查询器方法设置它的话,您也可以省略所有参数: $db-from(pages)-set(array(tit
17、le = My new title)-where(array(id = 5)-update();必须注意的是,上述方法只能用于在没有表前缀的情况下。如果有表前缀,例如prefix_pages,那么会出错,请使用下列方法之一 $db-set(array(title = My new title)-where(array(id = 5)-update(pages); / 将表名放到update语句里/ or$db-from(pages)-set(array(title = My new title)-where(array(id = 5)-update(pages); / from和update均
18、添加表名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()创建限制部分查询。第一个
19、参数你要查询限制的结果数量。 你也可以在这个方法设置偏移(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() 方法也支持多字段排序,如果你设置的是数组形式。
20、$db-orderby( array( id = ASC, date_created = ASC) );join()连接两个表。 1. string - 要连接的表名2. string/array - where 键名或键名 值形式的数组3. string - where 值4. string - 连接类型 - LEFT,RIGHT,OUTER,INNER,LEFT OUTER,RIGHT OUTER/ 执行查询连接 user_roles 表$db-from(users_roles);/ 把 roles 连接到 user_roles$db-join(roles, roles.id, users
21、_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);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1