在 Drupal 7 中操作数据库 - 第8课 - 插入查询(INSERT INTO)
插入查询应始终使用查询构造器(Query Builder)。某些数据库需要对 LOB(Large Object,例如 MySQL 中的 TEXT)和 BLOB(Binary Large Object)字段进行特殊处理,因此需要通过数据库抽象层为不同的数据库驱动实现相应的处理逻辑。
插入查询以函数 db_insert() 开始:
<?php
$query = db_insert('node', $options);
?>
该插入查询会创建一个查询对象,用于向表 node 中插入一条或多条记录。请注意,不需要使用花括号包裹表名,查询构造器会自动处理。
插入查询使用 Fluent API(链式调用),这意味着所有方法(包括 execute())都会返回查询对象自身,从而可以连续调用多个方法。
插入查询支持多种模式以适应不同用途。通常,我们先定义要插入的字段,然后指定要插入的值。以下列出了常见的几种使用模式。
在 Drupal 7 中操作数据库 - 第9课 - 更新查询(UPDATE)
更新查询应始终使用查询构造器(Query Builder)。不同的数据库对 LOB(Large Object,如 MySQL 中的 TEXT)和 BLOB(Binary Large Object)字段有各自的处理方式,因此需要在数据库抽象层中为每个驱动实现特定的处理逻辑。
更新查询从函数 db_update() 开始:
<?php
$query = db_update('node', $options);
?>
通过创建此更新查询对象,我们可以修改表 node 中的一条或多条记录。请注意,不需要使用花括号包裹表名,查询构造器会自动处理。
更新查询对象使用 Fluent API(链式调用),因此除 execute() 外的所有方法都会返回查询对象自身,从而支持方法链调用。在大多数情况下,这意味着查询不需要存储为变量。
在 Drupal 7 中操作数据库 - 第10课 - 删除查询(DELETE)
删除查询应使用查询构造器(Query Builder)。它们从函数 db_delete() 开始:
<?php
$query = db_delete('node', $options);
?>
此删除查询将从表 node 中删除记录。请注意,无需在表名外加花括号,查询构造器会自动处理。删除查询使用 Fluent API(链式调用),即除 execute() 之外的所有方法都会返回查询对象本身(与更新 UPDATE 和插入 INSERT 查询相同)。
删除查询非常简单,仅使用 WHERE 表达式。关于 WHERE 的详细内容将在后续课程中讲解,现在我们来看一个基本的删除示例:
在 Drupal 7 中操作数据库 - 第11课 - 合并查询(MERGE)
合并查询是一种特殊的混合类型查询。尽管这种语法在 SQL 2003 中被定义,但实际上几乎没有数据库原生支持该语法。然而,大多数数据库都提供了各自特定的替代实现。Drupal 中的合并查询构造器(Merge Query Builder)将“合并查询”的概念抽象为对象结构,这样系统可以根据不同数据库的特性分别编译对应的查询语句。
总体而言,合并查询是 INSERT 与 UPDATE 查询的组合。如果满足某个条件(例如表中存在指定键的记录),则执行一个查询;否则执行另一个查询。大多数情况下,它等价于以下逻辑:
在 Drupal 7 中操作数据库 - 第12课 - 查询条件(WHERE、HAVING、LIKE)
查询条件允许我们选择仅符合特定限制的记录,例如两周内创建的节点、名称中包含“Drupal”一词的术语等。在 SQL 中,我们使用 WHERE 和 HAVING 来为 SELECT、UPDATE、DELETE 查询设置限制。在 Drupal 的动态查询中,也提供了用于处理查询条件的机制。这个机制在三种类型的查询(选择、更新、删除)中工作方式相同。
条件表达式的概念
条件包含在一个专门定义限制的表达式中。
合并(相加、并集、逻辑与)
每个条件可以由多个条件表达式组成,这些表达式可以组合在一起。条件通过运算符 AND(与) 和 OR(或) 来连接。
条件对象
Drupal 将每个条件片段表示为 QueryConditional 类的实例。条件对象是该类的一个实例。
我们来看一个 SQL 查询示例:
查询语句:
在 Drupal 中创建模块,快速入门
我们从 api.drupal.org 开始,打开钩子 hook_node_presave() 的页面,它会在节点(node)添加之前触发。
http://api.drupal.org/api/drupal/modules!node!node.api.php/function/hook_node_validate/7
钩子允许我们将自定义代码嵌入 Drupal 的正常执行流程中,例如添加验证、数据字段、表单元素等。
在目录 sites/all/modules 中添加我们的模块:
Drupal 7 模块由哪些部分组成?
在开始创建我们的模块之前,我还要简单介绍一下 Drupal API 的一些功能。API 提供了强大的功能,用于处理分类(Taxonomy)、节点(Node)、用户(User)、数据库的输入和输出等。为了让模块与 Drupal 核心以及模块之间相互交互,Drupal 提供了一个“钩子(Hook)”系统。钩子是一种回调机制,也就是说,当代码执行到钩子时,会调用我们在自己模块中定义的函数,从而“插入”自定义代码。通过这种方式,我们可以处理用户数据、菜单、分类、不同内容类型的节点等。
在以下页面中:
http://api.drupal.org/api/drupal/includes--module.inc/group/hooks/7
Drupal 7 hook_block_info() 和 hook_block_view() 在区块中输出信息
在上一课中,我们为 Drupal 7 创建了一个模块,而在本课中,我们将继续扩展模块的功能。我们将通过 hook_block_view() 和 hook_block_info() 添加一个区块(block)输出。在这个区块中,将显示站点上最近注册的用户列表,并附带指向他们个人页面的链接。
我们先来看一下 hook_block_info() 的说明:
定义由模块创建的所有区块。
此钩子在 Drupal 中用于定义模块将输出哪些区块,同时还可以描述区块的显示设置。
在 hook_block_info() 中,模块的每个区块都会获得一个唯一的标识符 "delta"(即返回数组的键)。该 delta 值在模块中必须唯一,并用于以下场景:
Hook_menu Drupal 7 通过模块创建页面
在上一课中,我们学习了如何通过 Drupal API 从数据库中输出信息,具体来说使用了钩子 hook_block_info() 和 hook_block_view()。在本课中,我们将学习如何输出页面,也就是使用钩子 hook_menu,将页面连接到 Drupal 的其他部分,如菜单、翻译模块、模板等。
我们从简单的开始,创建一个页面,用于输出最近 10 条新闻的标题和描述。这样就能得到一个简短的新闻列表。我们将使用 hook_menu()。以下是它的说明,之后我们会进行实际使用。
hook_menu()
定义菜单项并返回页面。
当模块中调用此钩子时,它会注册路径,并指定 Drupal 处理的顺序。路径既可以仅用于处理请求,也可以被添加到菜单中,例如导航菜单。路径及其相关信息称为 menu router item。此钩子只在特定情况下被调用(例如启用模块时),其结果会被缓存到数据库中。因此,在修改模块中的钩子后,通常需要清除缓存。
hook_permission Drupal 7 不同角色的访问权限
在之前的课程中,我们已经在不同位置输出了页面和区块,并且使用了 access arguments 和 access callback 属性来设置页面访问限制。在本课中,我们将创建一种更灵活的方式,通过管理页面来编辑操作的访问权限。为此,我们将使用 hook_permission()(在 Drupal 6 中该钩子名为 hook_perm())。
hook_permission()
定义用户的权限。
该钩子可以添加权限,使您的模块能够定义哪些权限会出现在用户权限页面上。同时,该钩子还可用于控制模块执行的动作(actions)的全部或部分访问。
权限通过 user_access() 函数进行检查。
返回值
返回一个数组,其键是权限名称,对应的值是包含以下键值对的数组:
title:权限的可读名称,会显示在权限页面上。此值应使用 t() 函数包装,以便可以被翻译成其他语言。