之前我發了一篇博文PHP數據庫操作:從MySQL原生API到PDO,向大家展示PHP是如何使用MySQL原生API
、MySQLi面向過程
、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安裝:
composer require catfan/Medoo
composer update
直接下載:
https://github.com/catfan/Medoo/archive/master.zip
開始使用
引入Medoo並配置數據庫:
<?php
//使用Composer安裝的這樣引入
//require 'vendor/autoload.php';
// 直接下載的這樣引入
require_once 'medoo.php';
// 初始化
$db = new medoo([
'database_type' => 'mysql',
'database_name' => 'test',
'server' => 'localhost',
'username' => 'root',
'password' => '123456',
'charset' => 'utf8',
//可選:端口
'port' => 3306,
//可選:表前綴
'prefix' => '',
// PDO驅動選項 http://www.php.net/manual/en/pdo.setattribute.php
'option' => [
PDO::ATTR_CASE => PDO::CASE_NATURAL
]
]);
如果是SQLite:
$database = new medoo([
'database_type' => 'sqlite',
'database_file' => 'my/database/path/database.db'
]);
CURD
查詢(Read):
select($table, $columns, $where) //獲取所有記錄
- table [string] 表名
- columns [string/array] 字段
- where (可選) [array] 查詢條件
get($table, $columns, $where) //僅獲取一條數據
select($table, $join, $columns, $where)
- table [string] 表名
- join [array] 關聯查詢,如果沒有可以忽略
- columns [string/array] 字段
- where (可選) [array] 查詢條件
示例:
$user = $db->select('user', '*'); //返回所有數據
$user = $db->get('user', '*'); //返回一條數據
$user = $db->select('user','*', array('name ' => 'joy'));
$user = $db->select('user','name', array('age[>] ' => 20));
$user = $db->select('user',['name','age'], array('age[<=] ' => 20));
新增(Create):
insert($table, $data)
示例:
$db->insert('user', array('name'=> 't3', 'age'=>22)); //返回自增id
注意:如果數據里面包含子數組將會被serialize()
序列化, 你可以使用json_encode()
作為JSON存儲.
更新(Update):
update($table, $data, $where)
示例:
$db->update('user', array('name'=> 't5'), array('id'=> 23)); //返回受影響的行數
刪除(Delete):
delete($table, $where)
示例:
$db->update('user', array('id'=> 23)); //返回受影響的行數
where
聚合查詢
$db->has('user', array('id'=> 23)); //記錄是否存在
$db->count('user', array('id[>]'=> 23)); //統計
$db->max('user', 'age', array('gender'=> 1)); //最大值
$db->min('user', 'age', array('gender'=> 2)); //最小值
$db->avg('user', 'age', array('gender'=> 2)); //平均值
$db->sum('user', 'age', array('gender'=> 2)); //求和
以上方法均支持第二個參數是$join
,即關聯查詢。
事務機制
$db->action(function($db) {
try{
$db->insert("account", [
"name" => "foo",
"email" => "bar@abc.com"
]);
$db->delete("account", [
"user_id" => 2312
]);
}catch(Exception $e){
// 返回false就會回滾事務
return false;
}
});
使用query
可以直接使用SQL。
//查詢
$data = $db->query("SELECT * FROM user")->fetchAll();
print_r($data);
//刪除
$db->query("DELETE FROM user where name='t5' ");
直接使用PDO
Medoo是基於PDO的,所以可以直接調用PDO實例。
獲取PDO實例:
$pdo = $db->pdo;
接下來,可以使用PDO對象的所有方法了。
1.PDO::beginTransaction — 啟動一個事務
2.PDO::commit — 提交一個事務
3.PDO::__construct — 創建一個表示數據庫連接的 PDO 實例
4.PDO::errorCode — 獲取跟數據庫句柄上一次操作相關的 SQLSTATE
5.PDO::errorInfo — 獲取錯誤信息
6.PDO::exec — 執行一條 SQL 語句,並返回受影響的行數
7.PDO::getAttribute — 取回一個數據庫連接的屬性
*8.PDO::getAvailableDrivers — 返回一個可用驅動的數組(了解即可)
*9.PDO::inTransaction — 檢查是否在一個事務內(了解即可)
10.PDO::lastInsertId — 返回最后插入行的ID或序列值
11.PDO::prepare — 創建SQL的預處理,返回PDOStatement對象
12.PDO::query — 用於執行查詢SQL語句,返回PDOStatement對象
13.PDO::quote — 為sql字串添加單引號
14.PDO::rollBack — 回滾一個事務
15.PDO::setAttribute — 設置屬性
示例:
$stmt = $pdo->query('select * from user limit 2'); //返回一個PDOStatement對象
//$row = $stmt->fetch(); //從結果集中獲取下一行,用於while循環
$rows = $stmt->fetchAll(); //獲取所有
print_r($rows);
pdo事務:
$pdo->beginTransaction();//開啟事務處理
try{
//PDO預處理以及執行語句...
$pdo->commit();//提交事務
}catch(PDOException $e){
$pdo->rollBack();//事務回滾
//相關錯誤處理
throw $e;
}
使用DEBUG
debug() 打印最終的SQL語句
在select
、get
、insert
、update
等方法前面加上debug()
方法可以打印SQL語句,程序不會繼續運行:
$user = $db->debug()->select('user', '*');
//SELECT "name","age" FROM "user" WHERE "age" <= 20
error() 返回最后一次操作的出錯信息
$db->select('user3', '*');
var_dump($db->error());
log() 返回所有的SQL查詢語句,不影響查詢正常執行
$db->select('user', '*');
var_dump($db->log());
last_query() 和log()
類似,但僅返回最后一條SQL查詢語句,不影響查詢正常執行
$db->select('user', '*');
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
(未完待續。。。)