基础功能
配置文件application/configs/application.ini 添加数据库配置:
一般来说,db model是一个数据库的访问入口,Star_Model_Abstract继承,更特殊的是,它是某个特定数据库表会的访问入口。每个model使用数据表,例如,Usermodel使用'user'表。下面是一个简单的User model在SF中的demo:
class UserModel extends Star_Model_Abstract
{
protected $_name = "users";
protected $_primary = "user_id";
}
?>
操作
insert
- data //插入数据
返回last_insert_id
//返回last_insert_id
$this->insert(array(
"username" => "john",
"age"; => 25,
));
update
- where //更新条件
- data //更新数据
- quote_indentifier //是否给data数据添加添加引号处理 默认true
返回影响行数
//直接传数字表示主键值,等于更新user_id=1
$this->update(1, array("age" => 26));
$this->update("username" => "john", array("age" => 27));
//表示给user_id=1的用户年龄加1
$this->update(1, array("age" => "age + 1"), false);
delete
- sql //sql语句
查询返回结果集,操作返回影响行数
查询
- pk_id //主键ID
返回主键信息
//执行SQL:SELECT * FROM `users` WHERE (user_id = 1) limit 1; 返回user_id=1的用户信息
$this->getPk(1);
fetchAll
- where //查询条件
- conditions //查询字段 默认 *,返回所有字段
- order //排序 默认 null, null表示没有排序
- page //当前页数 默认null, null表示没有限制
- page_size //限制多少数据 默认null, null表示没有限制
返回结果集列表
//执行SQL:SELECT * FROM `users` WHERE (age > 18) ORDER BY age ASC LIMIT 20 OFFSET 0,返回前面20条年龄大于18的所有用户列表,按照年龄升序排序
//执行SQL: SELECT user_id, age FROM `users` WHERE (age > 18) ORDER BY age ASC, 返回年龄大于18的所有用户列表,按照年龄升序排序
$this->fetchAll("age> 18", array("user_id", "age"), "age ASC");
//执行SQL:SELECT user_id as id, age FROM `users` WHERE (age > 18) ORDER BY age ASC,返回年龄大于18的所有用户列表,按照年龄升序排序
$this->fetchAll("age > 18" array("id" => "user_id", "age"), "age ASC");
//执行SQL: SELECt * FROM `users` WHERE (age > 18) ORDER BY age ASC, user_id ASC,返回年龄大于18的所有用户列表,按照年龄和user_id升序排序
$this->fetchAll("age > 18", "*", array("age ASC", "user_id ASC"));
fetchRow
- where //查询条件
- conditions //查询字段 默认 * 返回所有字段
- order //排序 默认 null, null表示没有排序
返回第一行结果集数据
//执行SQL:SELECT * FROM `users` WHERE (user_id = 1) LIMIT 1,返回user_id = 1的用户信息
$this->fetchRow("user_id = 1");
fetchOne
- where //查询条件
- conditions //查询字段 默认 * 返回所有字段
- order //排序 默认 null, null表示没有排序
只返回第一个字段值
fetchCol
- where //查询条件
- conditions //查询字段 默认 *,返回所有字段
- order //排序 默认 null, null表示没有排序
- page //当前页数 默认null, null表示没有限制
- page_size //限制多少数据 默认null, null表示没有限制
返回所有结果集的第一个字段列表
$this->fetchCol("age > 18", "user_id");
当你需要顺序执行多个相关的的query
时,你可以把他们封装到一个事务中去保护数据一致性。SF提供了一个简单的接口来实现事务操作。 如下执行 SQL 事务查询语句:
$this->beginTransaction();
try{
//...执行SQL...
//提交
$this->commit();
} catch(Exception $e){
//回滚
$this->rollback();
}
主从
很多数据库支持数据库复制 database replication来提高可用性和响应速度。 在数据库复制中,数据总是从主服务器 到 从服务器。 所有的插入和更新等写操作在主服务器执行,而读操作在从服务器执行。
通过application/configs/application.ini 添加配置可以实现数据库复制和读写分离。
;单从库配置
resources.db.multi_slave_db = false
resources.db.slave_db.adapter = pdo_mysql
resources.db.slave_db.params.host = loclhost
resources.db.slave_db.params.dbname = dbname
resources.db.slave_db.params.username = user
resources.db.slave_db.params.password = password
;多从库配置
resources.db.multi_slave_db = true
resources.db.slave_db.0.adapter = pdo_mysql
resources.db.slave_db.0.params.host = loclhost
resources.db.slave_db.0.params.dbname = dbname
resources.db.slave_db.0.params.username = user
resources.db.slave_db.0.params.password = password
resources.db.slave_db.1.adapter = pdo_mysql
resources.db.slave_db.1.params.host = loclhost
resources.db.slave_db.1.params.dbname = dbname
resources.db.slave_db.1.params.username = user
resources.db.slave_db.1.params.password = password
以上的配置实现了主从的结构,从服务器用以执行读查询,主服务器执行写入查询,读写分离的功能由后台代码自动完成.调用者无须关心。
在特定情景下,开发者需要调用主库查询,SF也提供了很方便的调用方法:
为了快速帮忙开发者检测定位慢查询,SF提供了慢查询配置:
;开启慢查询
resources.db.slow_query_log = true
resources.db.slow_query_time = 2
提示:日志文件位置请参考日志文档