PHP數據庫操做:使用ORM

以前我發了一篇博文PHP數據庫操做:從MySQL原生API到PDO,向你們展現PHP是如何使用MySQL原生APIMySQLi面向過程MySQLi面向對象PDO操做MySQL數據庫的。本文介紹如何使用ORM操做數據庫。php

什麼是ORM呢?引用網友的話:html

ORM 對象關係映射,O(Object) 對象,在項目中就是實體,更加精確的來講就是數據Model,也能夠說持久化類。R(Relation) 關係數據,M (Mapping)映射,將對象映射到關係數據,將關係數據映射到對象的過程。更加直觀理解就是,ORM 就是以OOP思想,產生增刪改查SQL語句。mysql

相比PDO,ORM更適合快速開發項目,而不用寫SQL語句。下面介紹幾個好用的ORM。git

Medoo

下文均以版本1.0.2爲例。github

環境要求

PHP 5.1+, 推薦PHP 5.4+ 且支持PDO.
至少安裝了MySQL, MSSQL, SQLite其中一種.sql

如何安裝

Medoo支持Composer安裝和直接下載。數據庫

使用Composer安裝:json

composer require catfan/Medoo
composer update

直接下載:
https://github.com/catfan/Medoo/archive/master.zipapi

開始使用

引入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 實現來和數據庫的互動。 每一個數據庫表對應一個模型文件。

參考:
一、Guidebook - Medoo
http://medoo.in/api/new/
二、Eloquent ORM筆記 - 飛鴻影~ - 博客園
http://www.cnblogs.com/52fhy/p/5277657.html

(未完待續。。。)

相關文章
相關標籤/搜索