基础功能

    配置文件application/configs/application.ini 添加数据库配置:

    一般来说,db model是一个数据库的访问入口,Star_Model_Abstract继承,更特殊的是,它是某个特定数据库表会的访问入口。每个model使用数据表,例如,Usermodel使用'user'表。下面是一个简单的User model在SF中的demo:

    1. class UserModel extends Star_Model_Abstract
    2. {
    3. protected $_name = "users";
    4. protected $_primary = "user_id";
    5. }
    6. ?>

    操作

    insert

    • data //插入数据
      返回last_insert_id
    1. //返回last_insert_id
    2. $this->insert(array(
    3. "username" => "john",
    4. "age"; => 25,
    5. ));

    update

    • where //更新条件
    • data //更新数据
    • quote_indentifier //是否给data数据添加添加引号处理 默认true
      返回影响行数
    1. //直接传数字表示主键值,等于更新user_id=1
    2. $this->update(1, array("age" => 26));
    3. $this->update("username" => "john", array("age" => 27));
    4. //表示给user_id=1的用户年龄加1
    5. $this->update(1, array("age" => "age + 1"), false);

    delete

    • sql //sql语句
      查询返回结果集,操作返回影响行数

    查询

    • pk_id //主键ID
      返回主键信息
    1. //执行SQL:SELECT * FROM `users` WHERE (user_id = 1) limit 1; 返回user_id=1的用户信息
    2. $this->getPk(1);

    fetchAll

    • where //查询条件
    • conditions //查询字段 默认 *,返回所有字段
    • order //排序 默认 null, null表示没有排序
    • page //当前页数 默认null, null表示没有限制
    • page_size //限制多少数据 默认null, null表示没有限制
      返回结果集列表
    1. //执行SQL:SELECT * FROM `users` WHERE (age > 18) ORDER BY age ASC LIMIT 20 OFFSET 0,返回前面20条年龄大于18的所有用户列表,按照年龄升序排序
    2. //执行SQL: SELECT user_id, age FROM `users` WHERE (age > 18) ORDER BY age ASC, 返回年龄大于18的所有用户列表,按照年龄升序排序
    3. $this->fetchAll("age> 18", array("user_id", "age"), "age ASC");
    4. //执行SQL:SELECT user_id as id, age FROM `users` WHERE (age > 18) ORDER BY age ASC,返回年龄大于18的所有用户列表,按照年龄升序排序
    5. $this->fetchAll("age > 18" array("id" => "user_id", "age"), "age ASC");
    6. //执行SQL: SELECt * FROM `users` WHERE (age > 18) ORDER BY age ASC, user_id ASC,返回年龄大于18的所有用户列表,按照年龄和user_id升序排序
    7. $this->fetchAll("age > 18", "*", array("age ASC", "user_id ASC"));

    fetchRow

    • where //查询条件
    • conditions //查询字段 默认 * 返回所有字段
    • order //排序 默认 null, null表示没有排序
      返回第一行结果集数据
    1. //执行SQL:SELECT * FROM `users` WHERE (user_id = 1) LIMIT 1,返回user_id = 1的用户信息
    2. $this->fetchRow("user_id = 1");

    fetchOne

    • where //查询条件
    • conditions //查询字段 默认 * 返回所有字段
    • order //排序 默认 null, null表示没有排序
      只返回第一个字段值

    fetchCol

    • where //查询条件
    • conditions //查询字段 默认 *,返回所有字段
    • order //排序 默认 null, null表示没有排序
    • page //当前页数 默认null, null表示没有限制
    • page_size //限制多少数据 默认null, null表示没有限制
      返回所有结果集的第一个字段列表
    1. $this->fetchCol("age > 18", "user_id");

    当你需要顺序执行多个相关的的query时,你可以把他们封装到一个事务中去保护数据一致性。SF提供了一个简单的接口来实现事务操作。 如下执行 SQL 事务查询语句:

    1. $this->beginTransaction();
    2. try{
    3. //...执行SQL...
    4. //提交
    5. $this->commit();
    6. } catch(Exception $e){
    7. //回滚
    8. $this->rollback();
    9. }

    主从

    很多数据库支持数据库复制 database replication来提高可用性和响应速度。 在数据库复制中,数据总是从主服务器从服务器。 所有的插入和更新等写操作在主服务器执行,而读操作在从服务器执行。

    通过application/configs/application.ini 添加配置可以实现数据库复制和读写分离。

    1. ;单从库配置
    2. resources.db.multi_slave_db = false
    3. resources.db.slave_db.adapter = pdo_mysql
    4. resources.db.slave_db.params.host = loclhost
    5. resources.db.slave_db.params.dbname = dbname
    6. resources.db.slave_db.params.username = user
    7. resources.db.slave_db.params.password = password
    8. ;多从库配置
    9. resources.db.multi_slave_db = true
    10. resources.db.slave_db.0.adapter = pdo_mysql
    11. resources.db.slave_db.0.params.host = loclhost
    12. resources.db.slave_db.0.params.dbname = dbname
    13. resources.db.slave_db.0.params.username = user
    14. resources.db.slave_db.0.params.password = password
    15. resources.db.slave_db.1.adapter = pdo_mysql
    16. resources.db.slave_db.1.params.host = loclhost
    17. resources.db.slave_db.1.params.dbname = dbname
    18. resources.db.slave_db.1.params.username = user
    19. resources.db.slave_db.1.params.password = password

    以上的配置实现了主从的结构,从服务器用以执行读查询,主服务器执行写入查询,读写分离的功能由后台代码自动完成.调用者无须关心。

    在特定情景下,开发者需要调用主库查询,SF也提供了很方便的调用方法:

    为了快速帮忙开发者检测定位慢查询,SF提供了慢查询配置:

    1. ;开启慢查询
    2. resources.db.slow_query_log = true
    3. resources.db.slow_query_time = 2
    提示:日志文件位置请参考日志文档