[关闭]
@52fhy 2016-04-04T22:27:59.000000Z 字数 4095 阅读 445

PHP数据库操作:使用ORM

PHP


之前我发了一篇博文PHP数据库操作:从MySQL原生API到PDO,向大家展示PHP是如何使用MySQL原生APIMySQLi面向过程MySQLi面向对象PDO操作MySQL数据库的。本文介绍如何使用ORM操作数据库。

什么是ORM呢?引用网友的话:

ORM 对象关系映射,O(Object) 对象,在项目中就是实体,更加精确的来说就是数据Model,也可以说持久化类。R(Relation) 关系数据,M (Mapping)映射,将对象映射到关系数据,将关系数据映射到对象的过程。更加直观理解就是,ORM 就是以OOP思想,产生增删改查SQL语句。

相比PDO,ORM更适合快速开发项目,而不用写SQL语句。下面介绍几个好用的ORM。

Medoo

下文均以版本1.0.2为例。

环境要求

PHP 5.1+, 推荐PHP 5.4+ 且支持PDO.
至少安装了MySQL, MSSQL, SQLite其中一种.

如何安装

Medoo支持Composer安装和直接下载。

使用Composer安装:

  1. composer require catfan/Medoo
  2. composer update

直接下载:
https://github.com/catfan/Medoo/archive/master.zip

开始使用

引入Medoo并配置数据库:

  1. <?php
  2. //使用Composer安装的这样引入
  3. //require 'vendor/autoload.php';
  4. // 直接下载的这样引入
  5. require_once 'medoo.php';
  6. // 初始化
  7. $db = new medoo([
  8. 'database_type' => 'mysql',
  9. 'database_name' => 'test',
  10. 'server' => 'localhost',
  11. 'username' => 'root',
  12. 'password' => '123456',
  13. 'charset' => 'utf8',
  14. //可选:端口
  15. 'port' => 3306,
  16. //可选:表前缀
  17. 'prefix' => '',
  18. // PDO驱动选项 http://www.php.net/manual/en/pdo.setattribute.php
  19. 'option' => [
  20. PDO::ATTR_CASE => PDO::CASE_NATURAL
  21. ]
  22. ]);

如果是SQLite:

  1. $database = new medoo([
  2. 'database_type' => 'sqlite',
  3. 'database_file' => 'my/database/path/database.db'
  4. ]);

CURD

查询(Read):

  1. select($table, $columns, $where) //获取所有记录
  2. - table [string] 表名
  3. - columns [string/array] 字段
  4. - where (可选) [array] 查询条件
  5. get($table, $columns, $where) //仅获取一条数据
  6. select($table, $join, $columns, $where)
  7. - table [string] 表名
  8. - join [array] 关联查询,如果没有可以忽略
  9. - columns [string/array] 字段
  10. - where (可选) [array] 查询条件

示例:

  1. $user = $db->select('user', '*'); //返回所有数据
  2. $user = $db->get('user', '*'); //返回所有数据
  3. $user = $db->select('user','*', array('name ' => 'joy'));
  4. $user = $db->select('user','name', array('age[>] ' => 20));
  5. $user = $db->select('user',['name','age'], array('age[<=] ' => 20));

新增(Create):

  1. insert($table, $data)

示例:

  1. $db->insert('user', array('name'=> 't3', 'age'=>22)); //返回自增id

注意:如果数据里面包含子数组将会被serialize()序列化, 你可以使用json_encode()作为JSON存储.

更新(Update):

  1. update($table, $data, $where)

示例:

  1. $db->update('user', array('name'=> 't5'), array('id'=> 23)); //返回受影响的行数

删除(Delete):

  1. delete($table, $where)

示例:

  1. $db->update('user', array('id'=> 23)); //返回受影响的行数

where

聚合查询

  1. $db->has('user', array('id'=> 23)); //记录是否存在
  2. $db->count('user', array('id[>]'=> 23)); //统计
  3. $db->max('user', 'age', array('gender'=> 1)); //最大值
  4. $db->min('user', 'age', array('gender'=> 2)); //最小值
  5. $db->avg('user', 'age', array('gender'=> 2)); //平均值
  6. $db->sum('user', 'age', array('gender'=> 2)); //求和

以上方法均支持第二个参数是$join,即关联查询。

事务机制

  1. $db->action(function($db) {
  2. try{
  3. $db->insert("account", [
  4. "name" => "foo",
  5. "email" => "bar@abc.com"
  6. ]);
  7. $db->delete("account", [
  8. "user_id" => 2312
  9. ]);
  10. }catch(Exception $e){
  11. // 返回false就会回滚事务
  12. return false;
  13. }
  14. });

使用query

可以直接使用SQL。

  1. //查询
  2. $data = $db->query("SELECT * FROM user")->fetchAll();
  3. print_r($data);
  4. //删除
  5. $db->query("DELETE FROM user where name='t5' ");

直接使用PDO

Medoo是基于PDO的,所以可以直接调用PDO实例。

获取PDO实例:

  1. $pdo = $db->pdo;

接下来,可以使用PDO对象的所有方法了。

  1. 1.PDO::beginTransaction 启动一个事务
  2. 2.PDO::commit 提交一个事务
  3. 3.PDO::__construct 创建一个表示数据库连接的 PDO 实例
  4. 4.PDO::errorCode 获取跟数据库句柄上一次操作相关的 SQLSTATE
  5. 5.PDO::errorInfo 获取错误信息
  6. 6.PDO::exec 执行一条 SQL 语句,并返回受影响的行数
  7. 7.PDO::getAttribute 取回一个数据库连接的属性
  8. *8.PDO::getAvailableDrivers 返回一个可用驱动的数组(了解即可)
  9. *9.PDO::inTransaction 检查是否在一个事务内(了解即可)
  10. 10.PDO::lastInsertId 返回最后插入行的ID或序列值
  11. 11.PDO::prepare 创建SQL的预处理,返回PDOStatement对象
  12. 12.PDO::query 用于执行查询SQL语句,返回PDOStatement对象
  13. 13.PDO::quote sql字串添加单引号
  14. 14.PDO::rollBack 回滚一个事务
  15. 15.PDO::setAttribute 设置属性

示例:

  1. $stmt = $pdo->query('select * from user limit 2'); //返回一个PDOStatement对象
  2. //$row = $stmt->fetch(); //从结果集中获取下一行,用于while循环
  3. $rows = $stmt->fetchAll(); //获取所有
  4. print_r($rows);

pdo事务:

  1. $pdo->beginTransaction();//开启事务处理
  2. try{
  3. //PDO预处理以及执行语句...
  4. $pdo->commit();//提交事务
  5. }catch(PDOException $e){
  6. $pdo->rollBack();//事务回滚
  7. //相关错误处理
  8. throw $e;
  9. }

使用DEBUG

debug() 打印最终的SQL语句

selectgetinsertupdate等方法前面加上debug()方法可以打印SQL语句,程序不会继续运行:

  1. $user = $db->debug()->select('user', '*');
  2. //SELECT "name","age" FROM "user" WHERE "age" <= 20

error() 返回最后一次操作的出错信息

  1. $db->select('user3', '*');
  2. var_dump($db->error());

log() 返回所有的SQL查询语句,不影响查询正常执行

  1. $db->select('user', '*');
  2. var_dump($db->log());

last_query()log()类似,但仅返回最后一条SQL查询语句,不影响查询正常执行

  1. $db->select('user', '*');
  2. var_dump($db->last_query());

Eloquent ORM

Eloquent ORM是Laravel框架使用的ORM。Laravel 的 Eloquent ORM 提供了更优雅的ActiveRecord 实现来和数据库的互动。 每个数据库表对应一个模型文件。

参考:
1、Guidebook - Medoo
http://medoo.in/api/new/
2、Eloquent ORM笔记 - 飞鸿影~ - 博客园
http://www.cnblogs.com/52fhy/p/5277657.html

(未完待续。。。)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注