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 — 取得跟資料庫句柄上一次操作相關的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" <= 20error() 回傳最後一次操作的錯誤訊息
$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使用ORM進行資料庫操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!