## 什么是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/