## 什么是PINQ?
數據的表現形式有很多種比如:內存里的數組,JSON文件,數據表等等...
查詢不同的數據源有不同的查詢方式,開發者需要熟練掌握對應的API才能編寫出正確并且高效的查詢程序。
那么有沒有一種通用的查詢API呢?
PINQ應運而生,它借鑒了.NET的LINQ(語言集成查詢)技術,以單一可讀性和簡潔流暢的API統一了跨數組/迭代器和外部數據源的查詢。
## 一個簡單的例子
~~~
$youngMeberDetails = $member
->where(function ($row) {
return $row['age'] <= 50;//查詢年齡小于50歲的會員
})
->orderByAscending(function ($row) {
return $row['id']; //根據會員編號進行排序
})
->take(50)//獲取前50條
->select(function ($row) {
//返回的對象格式
return [
'id' => $row['id'],
'name' => $row['name'],
'age' => $row['age']
];
});
~~~
上述查詢針對的數據源,可能是數組、文件、緩存或者數據庫表。PINQ使PHP開發人員可以用最強大和最自然的語言來模糊內存和外部數據源之間的界限。
## 特點
### 集成化:
* 很早以前,我們只是把sql語句以string的形式拼接起來,通過數據庫驅動發送給數據庫服務器,然后服務器返回結果集。這里的缺陷就是,如果你的sql語句寫的有問題,只有到程序運行時才知道。而且并不是所有的人都懂數據庫,或者換一種說法并不是所有人都能編寫出高效的SQL語句。
* PINQ把查詢融入到了PHP語言中,把以前復雜的查詢前的工作都集成封裝起來,讓開發人員側重于編寫和構思查詢的邏輯而不是花大量時間和精力去檢查查詢語句的拼接。
* 集成后的語法更加的清晰易懂,可讀性較高。
### 層次化:
* SQL是關系型數據庫,它以關系的方式描述數據與數據的聯系,但我們的程序通常設計成面向對象的因此我們在程序里得到的數據庫數據往往都是rectangular grid(平面的顯示數據)。PINQ通過ORM(對象關系映射)的方式,把關系型平面數據轉換成對象的方式描述數據。這樣帶來的好處是:開發者能直接以對象的方式去操作數據,對于習慣面向對象的開發者來說面向對象模型更易理解。
* 當然不僅僅只是SQL,對于任何數據源。只要有合適的provider提供程序,PINQ都能將他們抽象為同一層次。
### 可擴展:
* 數據源的擴展:開發者只需要去實現特定的接口,就可以為PINQ創建或提供provider讓PINQ支持更多的數據源。
* 方法擴展:開發者可以根據自己的需求為PINQ重寫和擴展查詢方法。
* * * * *
## 為什么使用PINQ?
目前有大量的可用于php的 LINQ實現,為什么選擇這一個?除了因為大多數項目沒有維護者也沒有貢獻者之外,它們并不是完整的,或者并不是真正的LINQ實現。當然,提供一些很好的數組處理語法是很酷的,但LINQ不僅僅只是這些。
## PINQ旨在提供:
1. 良好的結構和測試代碼庫
2. 全面的composer和PSR-4支持
3. 完整和詳盡的文檔
4. LINQ風格的流暢查詢API具有延遲求值和不可變查詢對象
5. 真正無縫的外部查詢支持
6. 完全支持PHP閉包和回調語法
7. 甚至在原始LINQ基礎上,還提供了一個額外的可變查詢API
* * * * *
官網:http://elliotswebsite.com/Pinq/
GitHub: https://github.com/TimeToogo/Pinq/