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/Medoocomposer 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 — 擷取跟資料庫控制代碼上一次操作相關的 SQLSTATE5.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());
相關閱讀
對PHP PDO的一些認識小結
php中PDO方式實現資料庫的增刪改查
php使用pdo串連mssql server資料庫執行個體