首頁 >後端開發 >php教程 >PHP使用ORM進行資料庫操作

PHP使用ORM進行資料庫操作

*文
*文原創
2017-12-21 15:56:342975瀏覽

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 &#39;vendor/autoload.php&#39;;
      // 直接下载的这样引入
      require_once &#39;medoo.php&#39;; 
      // 初始化
      $db = new medoo([    
                  &#39;database_type&#39; => &#39;mysql&#39;,    
                  &#39;database_name&#39; => &#39;test&#39;,    
                  &#39;server&#39; => &#39;localhost&#39;,    
                  &#39;username&#39; => &#39;root&#39;,    
                  &#39;password&#39; => &#39;123456&#39;,    
                  &#39;charset&#39; => &#39;utf8&#39;,    
                //可选:端口
                &#39;port&#39; => 3306, 
                //可选:表前缀
                &#39;prefix&#39; => &#39;&#39;, 
                // PDO驱动选项 http://www.php.net/manual/en/pdo.setattribute.php
                &#39;option&#39; => [ PDO::ATTR_CASE => PDO::CASE_NATURAL ]
      ]);

如果是SQLite:

$database = new medoo([    &#39;database_type&#39; => &#39;sqlite&#39;,    &#39;database_file&#39; => &#39;my/database/path/database.db&#39;]);

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(&#39;user&#39;, &#39;*&#39;); 
//返回所有数据
$user = $db->get(&#39;user&#39;, &#39;*&#39;); 
//返回一条数据
$user = $db->select(&#39;user&#39;,&#39;*&#39;, array(&#39;name &#39; => &#39;joy&#39;));
$user = $db->select(&#39;user&#39;,&#39;name&#39;, array(&#39;age[>] &#39; => 20)); 
$user = $db->select(&#39;user&#39;,[&#39;name&#39;,&#39;age&#39;], array(&#39;age[<=] &#39; => 20));

新增(Create):

insert($table, $data)

範例:

$db->insert(&#39;user&#39;, array(&#39;name&#39;=> &#39;t3&#39;, &#39;age&#39;=>22)); //返回自增id

注意:如果資料裡麵包含子數組將會被serialize()序列化, 你可以使用json_encode()作為JSON儲存.

#更新(Update):

update($table, $data, $where)

範例:

$db->update(&#39;user&#39;, array(&#39;name&#39;=> &#39;t5&#39;), array(&#39;id&#39;=> 23)); //返回受影响的行数

刪除(Delete):

delete($table, $where)

範例:

$db->update(&#39;user&#39;,  array(&#39;id&#39;=> 23)); //返回受影响的行数

where

聚合查詢

$db->has(&#39;user&#39;,  array(&#39;id&#39;=> 23)); //记录是否存在
$db->count(&#39;user&#39;,  array(&#39;id[>]&#39;=> 23));//统计
$db->max(&#39;user&#39;, &#39;age&#39;, array(&#39;gender&#39;=> 1));//最大值
$db->min(&#39;user&#39;, &#39;age&#39;, array(&#39;gender&#39;=> 2)); //最小值
$db->avg(&#39;user&#39;,  &#39;age&#39;, array(&#39;gender&#39;=> 2)); //平均值
$db->sum(&#39;user&#39;,  &#39;age&#39;, array(&#39;gender&#39;=> 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=&#39;t5&#39; ");

直接使用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(&#39;select * from user limit 2&#39;); //返回一个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(&#39;user&#39;, &#39;*&#39;); 
//SELECT "name","age" FROM "user" WHERE "age" <= 20

error() 回傳最後一次操作的錯誤訊息

$db->select(&#39;user3&#39;, &#39;*&#39;); 
var_dump($db->error());

log() 傳回所有的SQL查詢語句,不影響查詢正常執行

$db->select(&#39;user&#39;, &#39;*&#39;); 
var_dump($db->log());

last_query() 和log()類似,但只傳回最後一個SQL查詢語句,不影響查詢正常執行

$db->select(&#39;user&#39;, &#39;*&#39;); 
var_dump($db->last_query());

相關閱讀

#對PHP PDO的一些認識小結

#php中PDO方式實作資料庫的增刪改查

#php使用pdo連線mssql server資料庫實例

以上是PHP使用ORM進行資料庫操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn