PHP中是否有与C#中的LINQ等效的东西?

Is there something in PHP equivalent to LINQ in C#?

eomeroff asked 2020-02-13T03:54:02Z
7个解决方案
35 votes

尝试YaLinqo。 这是用于PHP的最佳LINQ。

这是一个比较表:

Enter image description here

cystbear answered 2020-02-13T03:54:41Z
30 votes

(此处为YaLinqo开发人员。)

当前,在PHP中有LINQ的三种主要实现:

  • YaLinqo —在结构上最简约的库体系结构(4个类),但是功能最多,性能最高,具有最佳的文档和唯一的一种支持“字符串lambda”的字符串。

  • Ginq —一个平均大小(70个类)的库,其功能数量与YaLinqo相当,大约慢1.5–3倍,它包含自定义集合,迭代器和比较器,文档最多包含参数类型。

  • Pinq —一个巨大的库(500个类),支持解析PHP并将其转换为SQL,其他所有功能(比其他速度慢得多)都拥有漂亮的网站,但是其文档很一般,并且缺少功能。

其他库不值得一提(嗯,好的,LINQ for PHP,Phinq,PHPLinq和Plinq)。 它们几乎没有经过测试,评估也不是懒惰的,它们依赖于PHP和.NET开发人员都陌生的概念。 PHPLinq是唯一实际支持数据库的数据库,但是它更像是DAL,用于以固定的调用顺序而不是LINQ生成SQL。

如果您问我要选择哪个库,我只是说如果需要使用数组和对象以及任何ORM库(而不是LINQ),则需要使用YaLinqo。 但我会尽力解释原因。

性能

YaLinqo是迄今为止最快的库。 它的设计速度很快:它仅依赖于生成器(生成最快的迭代器); 它仅使用数组(没有实现为数组包装器的自定义集合)。 它的发展摆脱了缓慢和过时的功能:删除自定义集合,删除显式迭代器; 如果提高性能则会降低代码质量:在多个排序函数之间进行选择而不是使用一种通用解决方案,而是通过复制粘贴代码来减少函数调用的次数。

Gina和Pink使用了另一种方法,它们使用显式的迭代器类。 它极大地降低了性能,但允许将迭代器与流利的方法语法分开使用。

此外,它们都有性能陷阱。 在Ginq中使用属性访问器语法时,您的代码将变慢5倍。 当您尝试使用数组作为键时,还会有惊喜等着您。 当您在Pinq中使用加入时,您的代码会变慢数百倍或数千倍(我不是在开玩笑,请参阅下面的链接)在我的错误报告后,修复了在Pinq中加入的性能。

使用YaLinqo,它更简单:要么不起作用(如键中的数组),要么以预期的性能工作。 与原始LINQ一样,版本1确实有一些技巧使其成为可能,但当前版本没有。 它可能需要进行一些调整:例如,在相同情况下,您需要产生相等的键,而不是使用相等比较器。

请参阅文章:LINQ for PHP比较:YaLinqo,Ginq,Pinq在CodeProject上,LINQ for PHP:速度在Habrahabr(俄语)上很重要。 他们介绍了YaLinqoPerf,git存储库,并进行了性能测试,比较了原始PHP,YaLinqo,Ginq和Pinq。

特征

YaLinqo和Ginq中LINQ方法的数量及其功能非常接近。 我想说没有明确的赢家,因为这两个库都提供了另一个没有的方法。 它们大多是原始LINQ中不可用的额外方法,因此我不必担心太多。

Pinq看起来像一个空无一人的小镇。 方法是准系统,通常几乎不可用。 在编写性能测试时,我经常不得不为Pinq使用定制的更复杂的解决方案,而YaLinqo和Pinq的代码通常仅在方法名称上有所不同(不同的命名约定:“ desc”与“ descending”之类)。

另一方面,Pinq是唯一支持解析PHP并从中生成SQL的人。 不幸的是,唯一的查询提供程序是针对MySQL的,其状态为“演示”。 因此,尽管Pinq具有此独特功能,但不幸的是,它尚无法使用。

如果您希望LINQ到数据库成为现实,我想您别无选择,只能着手为Pinq开发查询提供程序。 这是一项非常复杂的任务,我怀疑一个开发人员是否能够为所有数据库单独提供高质量的查询提供程序。

Ginq拥有YaLinqo所没有的是更高级的体系结构。 在Ginq中使用public function hash($v) { return sha1(serialize($v)); }Dictionary类的地方,您会在YaLinqo中看到数组,并且只有数组。 在Ginq中使用ComparerEqualityComparer483的地方,您会在YaLinqo中看到闭包(或没有等效的闭包)。 从根本上讲,这是一个设计决策–库是否应该使用这种语言的程序员自然的概念,还是应该使用其他语言的程序员的自然概念。 图书馆只是做出了选择。

应该注意的是,更复杂的架构并不等于好的实现。 例如,Ginq使用public function hash($v) { return sha1(serialize($v)); }来计算“集合”中的键哈希。

文献资料

YaLinqo在PHPDoc和在线(从PHPDoc生成)中以出色的参考文档脱颖而出。 它主要是MSDN上适用于PHP的.NET中LINQ的文档。 如果您知道MSDN是什么,就知道它的质量。

Ginq的文档几乎不存在,它通常仅包含参数类型提示。

Pinq的文档相对不错(每个主要方法都有一两个句子来说明其功能),但是与YaLinqo的文档不匹配。

Ginq和Pinq在网络上都有很好的入门文章,向新开发者介绍概念。 YaLinqo除了自述中的疯狂示例(没有任何解释)外,没有任何介绍性文档。

Pinq也有一个漂亮的网站,这是三个库中唯一的一个。

其他一切

这三个库均具有良好的测试覆盖率,Composer集成,开放源代码许可以及其他可在生产中使用的库属性。

对于那些关心古代PHP版本的用户,YaLinqo 1.x需要PHP 5.3,YaLinqo 2.x需要PHP 5.5,Ginq需要PHP 5.3,Pinq需要PHP 5.4。

附言 如果您有任何补充,或认为我有偏见,请发表评论。 写了这么多文字后,我想念的是评论。 :)

Athari answered 2020-02-13T03:57:17Z
27 votes

有PHPLinq-用于PHP的LINQ。

Justin Niessner answered 2020-02-13T03:54:16Z
3 votes

在过去的两年中,PHP世界发生了很多变化,使以前的大多数答案都过时了。

这是用于PHP的主要LINQ实现的新比较表:

LINQ Library Comparison Table

这些库都可以通过composer安装。

总而言之,我将推荐PINQ库(因为我是作者,我对此有偏见),因为它一直在积极维护,有据可查并经过测试,并提供了PHP中真正的LINQ的实现。

真正的LINQ,我的意思是,该库不仅是用于内存中数组的流利的集合API,而且还使用表达式树实现了真正的查询解析。 这样可以将此API与外部数据源集成在一起,从而可以与PHP Integrated Query集成。 可以在此处查看此类功能的演示,其中将查询编译为SQL并针对MySQL数据库运行:

Elliot Levin answered 2020-02-13T03:57:56Z
2 votes

还有一个Phinq,它具有比PHPLinq更新的版本,与PHPLinq相比,C#对象看起来更像LINQ。

nover answered 2020-02-13T03:58:16Z
1 votes

好的PHP ORM库?

这个问题的答案说

看学说。

原则1.2实现了Active Record。 Doctrine 2+是DataMapper   ORM。

另外,请查看Xyster。 它基于数据映射器模式。

另外,看看DataMapper与Active Record。

Bastardo answered 2020-02-13T03:58:58Z
0 votes

请参阅PHPLinq(一组模仿C#3.0的LINQ的PHP类)。

moi_meme answered 2020-02-13T03:59:17Z
translate from https://stackoverflow.com:/questions/5792388/is-there-something-in-php-equivalent-to-linq-in-c