###使用数据库 Toknot数据库操作并没有实现传统意义上的ActiveRecord模型, 但是出于习惯,框架仍然叫ActiveRecord
ToKnot目前数据库操作相关的类主要包含如下几个:
- ActiveRecord 创建伪AR数据库对象模型
- ActiveQuery 数据库相关对象查询兼容层
- DatabaseObject 数据库对象
- DbTableObject 数据库表对象
- DbTableJoinObject 关联表对象
1.创建一个数据库对象模型实例
$AR = ActiveRecord::singleton();
//在应用中使用FMAI实例来进行访问
$AR = $FMAI->getActiveRecord();
2.使用数据库配置 数据库配置文件使用INI格式,类似如下:
[Database]
;数据库连接DSN
dsn = 'mysql:dbname=test;host=localhost;port=3306'
;数据库连接用户名
username = root
;数据库连接密码
password = 112211
;表前缀
prefix = tbl_
;相关PDO连接选项,见PHP PDO 的相关文档
dirverOptions[p] = 1
dirverOptions[c] = 0
DSN 的格式取决于所使用的 PDO 数据库驱动。总体来说, DSN 要含有 PDO 驱动的名字,跟上一个冒号,再跟上驱动特定的连接语法。可查阅PHP PDO 文档 获取更多信息。 下面是一个常用DSN格式的列表。
SQLite: sqlite:/path/to/dbfile
MySQL: mysql:host=localhost;dbname=testdb
PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb
SQL Server: mssql:host=localhost;dbname=testdb
Oracle: oci:dbname=//localhost:1521/testdb
//$CFG->Database为上面配置文件的Database块
$AR->config($CFG->Database);
3.连接数据库
通过调用ActiveRecord对象的connect()
方法,将创建一个数据库连接对象(DatabaseObject的实例),这样我们就可以使用数据库对象进行数据库操作
$database = $AR->connect();
4.数据库对象DatabaseObject的相关DAO操作方法
showTableList 获取表列表
tableJOIN 创建连表对象
createTable 创建一个数据库表
DatabaseObject对象实例的一个可访问属性即映射一个表实例(DbTableObject的实例)
5.创建连表对象
利用数据库的tableJOIN()
方法创建一个联表对象来进行LEFT JOIN
多表查询,代码类似下面
$tableJoin = $database->createTable($database->table1,$database->table2,$database->tabl3);
上面的方法将返回一个DbTableJoinObject对象 详细见第9条数据库联表查询
6.创建一个表 DatabaseObject::createTable() 目前只支持SQLite数据库表的创建 假如需要创建product表,他有一个三个字段,分别是:
pid 主键,自增长,整型数字
product_name 字符串,变长
可以使用如下方法创建:
$database->product->pid->type = 'integer';
$database->product->pid->isPK = true;
$database->product->pid->autoIncrement = true;
$database->product->product_name->type = 'varchar';
$database->product->product_name->length = 255;
$database->createTable();
DatabaseObject::createTable() 方法可以一次创建多个表,所以如果需要你可以在调用以前声明多个表的字段信息
7.表的查询 当获得了数据实例DatabaseObject以后,就可以访问该类的属性了,这些可访问属性都被映射到了该数据库的表上,每一个表就是一个DbTableObject实例,该对象提供了表的常用操作方法。 首先数据库映射DatabaseObject对象与表映射DbTableObject对象都提供了数据SQL语句的直接执行方法。使用方法见下面的代码:
//利用AR映射连接数据库,获得一个数据库实例
$database = $AR->connect();
//在该数据库中执行一条SQL语句
$sql = "SELECT * FROM theTable";
$database->exec($sql);
while($row = $database->fetch()) {
/**操作代码**/
}
//全部获取
$all = $database->fetchAll();
//或者通过表对象来查询
$result = $database->theTable->exec($sql);
//然后操作结果集
while($row = $database->theTable->fetch()) {
/**操作代码**/
}
//全部获取
$all = $database->theTable->fetchAll();
上面的方法在非常复杂的查询时非常有用.DatabaseObject::exec()与 DbTableObject::exec()方法都是继承于DbCRUD::exec()方法
DbCRUD还提供了可传参数到SQL中的CRUD操作方法,传参数的方法和PDO类似
-
Create/Insert:
$sql = "INSERT INTO tablename (id,name) VALUES(?,?)"; $database->create($sql, array(1,'test'));
-
Read/Select:
$sql = "SELECT * FROM table WHERE id = ?"; //只查询一条结果,该方法会自动设置LIMIT 1到SQL中 $database->readOne($sql, array(1)); //获取全部结果 $database->readAll($sql,array(1));
-
Update:
$sql = "UPDATE table SET name = ? WHERE id = ?"; $database->update($sql, array('test',1);
-
Delete:
$sql = "DELETE FROM table WHERE id = ?"; $database->delete($sql, array(1));
上面的例子只展示了DatabaseObject对象使用CRUD的方法,DbTableObject的使用方法与上面的一样
如果需要定制SELECT获取结果集的类型,需要在调用readOne()
与readAll()
方法以前设置当前对象的$fetchStyle
属性,像下面的代码那样:
use Toknot\Db\ActiveQuery;
//设置结果集类型
$database->fetchStyle = ActiveQuery::FETCH_ASSOC;
$sql = "SELECT * FROM table WHERE id = ?";
$database->readOne($sql, array(1));
//设置结果集类型
$database->table->fetchStyle = ActiveQuery::FETCH_ASSOC;
$sql = "SELECT * FROM table WHERE id = ?";
$database->table->readOne($sql, array(1));
$fetchStyle
属性的可选值定义在Toknot\Db\ActiveQuery中,包括下面几个类常量:
ActiveQuery::FETCH_ASSOC 字段名作为KEY名
ActiveQuery::FETCH_NUM 数字作为KEY名
ActiveQuery::FETCH_BOTH 字段和数字作为KEY名
ActiveQuery::FETCH_OBJ 返回对象模式
8.常用的表操作方法: DbTableObject提供的方法介绍和使用例子见类参考
DbTableObject::findByPK() 以主键为唯一条件进行SELECT查询
DbTableObject::deleteByPK() 以主键为唯一条件进行DELETE删除操作
DbTableObject::updateByPK() 以主键为唯一条件进行Update更新操作
DbTableObject::findByAttr() 以上文设置的表字段值为条件进行SELECT查询操作,所有的条件间拥有相同的逻辑关系
DbTableObject::findByWhere() 以上文设置的Where语句为条件进行SELECT查询操作
DbTableObject::updateByWhere() 以上文设置的Where语句为条件,以上文设置的字段为需要更新的自动进行更新操作
DbTableObject::save() 以上文设置的表字段值进行添加记录的操作
DbTableObject::deleteByWhere() 以上文设置的语句为条件进行删除操作
注意上面提供的方法中,上文设置Where语句在方法被调用后并不会被删除(重置)。而上文设置字段值将会在调用后被清除
9.联表查询
联表查询目前只支持LEFT JOIN
查询,该数据库操作由DbTableJoinObject提供
使用方法见下面的代码:
$ar = new create ActiveRecord()
$db = $ar->connect();
$joinTable = $db->tableJOIN($db->table1, $db->table2);
$joinTable->table1->alias = 'a';
$joinTable->table2->alias = 'b';
$joinTable->tableON($joinTable->table1->Id, $joinTable->table2->id);
$joinTable->where = 'a.id > 5'; //set where is table1 of id greater than 5
$joinTable->order = ActiveQuery::ORDER_DESC;
$joinTable->orderBy = 'b.id'; //set order by table2 of id
$joinTable->find(10);
更加详细的信息见DbTableJoinObject类参考