PHP數據庫操作:使用ORM


之前我發了一篇博文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安裝:

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語句

selectgetinsertupdate等方法前面加上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

(未完待續。。。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM