ORM(Object-Relational Mapping)即對象關系映射,是一種將面向對象的編程語言和關系型數據庫之間的數據進行映射的技術。ORM的出現使得開發人員可以使用面向對象的方式操作數據庫,很大程度上簡化了數據庫操作。而在Php中,使用ORM進行數據庫操作也成為了很多Web應用開發的首選。
ORM在PHP領域有很多封裝好的類庫提供使用,其中比較出名的有PDO、Doctrine、Eloquent等。下面以PDO和Eloquent為例來介紹一下ORM的基本封裝。
PDO封裝
PDO是PHP常用的關系型數據庫操作擴展,也是PDO封裝比較廣泛的一個。使用PDO封裝可以讓我們更加方便地操作數據庫。下面是一個使用PDO進行封裝的例子:
class Database { public $pdo; public function __construct($host,$dbname,$username,$password) { $dsn = "mysql:host=$host;dbname=$dbname;charset=UTF8"; $pdo = new PDO($dsn, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->pdo = $pdo; } public function query($sql,$params = []) { $statement = $this->pdo->prepare($sql); $statement->execute($params); return $statement; } public function findOne($sql,$params = []) { $statement = $this->pdo->prepare($sql); $statement->execute($params); return $statement->fetch(PDO::FETCH_ASSOC); } public function findAll($sql,$params = []) { $statement = $this->pdo->prepare($sql); $statement->execute($params); return $statement->fetchAll(PDO::FETCH_ASSOC); } }
在這個封裝類中,我們將PDO連接數據庫的操作封裝到了構造函數中。構造函數中還使用了PDO的setAttribute方法,設置PDO的錯誤處理方式為拋出異常。然后,我們封裝了對數據庫的操作。其中,query方法用來執行SQL語句,findAll方法用來獲取多個結果集,findOne方法用來獲取單個結果集。
Eloquent封裝
Eloquent是Laravel框架中的ORM類庫,非常易用。在使用Laravel框架進行開發的時候,我們可以非常方便地使用Eloquent來進行數據庫操作。下面是一個使用Eloquent進行封裝的例子:
use Illuminate\Database\Eloquent\Model; class User extends Model { protected $fillable = [ 'name', 'email', 'password', ]; }
在這個封裝類中,我們繼承了Eloquent的Model類,根據業務需求在fillable屬性中設置需要批量賦值的字段。然后,我們就可以愉快地進行各種數據庫操作了。例如:
$user = new User; $user->name = 'John'; $user->email = 'john@test.com'; $user->password = 'password'; $user->save(); $users = User::all(); $user = User::find(1); $user->email = 'new-email@test.com'; $user->save();
可以看到,使用Eloquent進行數據庫操作非常簡單,而且非常直觀。
總結
以上兩種封裝方式,都是在ORM的基礎上進行的二次封裝。ORM讓我們可以使用面向對象的方式操作數據庫,減少了很多手寫SQL的復雜度。在封裝過程中,我們將常規的操作進行了簡單的封裝,讓我們的代碼更加易讀易用。而且,使用ORM封裝還可以避免SQL注入等安全問題。
在實際開發中,我們可以根據業務需求選擇合適的ORM類庫,進行二次封裝。因為每個項目的需求和規模不同,所以封裝的方式和規范可能會有所不同。但是,不管使用哪種ORM類庫,我們都要盡量遵循面向對象的原則,讓我們的代碼更加通俗易懂,易維護。