使用PHP的LINQ

Ginq / PHPLinq 可以改写成:Ginq / PHPLinq 经常被用来手动的编写PHP+SQL代码。

我将尝试使用一个名为GINQ的库来实现PHP中的LINQ功能。

LINQ是什么东西?

使数据标准化的方式对数据集合进行查询。

.NET Framework将添加通用查询功能,并将查询功能应用于除关系数据和XML数据之外的所有信息源。

这是什么东西啊。
简单来说,它似乎是用类似SQL的方法来对数组、对象和其他各种集合进行SELECT。
我们马上试一试看。

<?php
    // Ginq
    require_once('path/to/ginq/Ginq.php');

    $sample1 = ['John', 'Peter', 'Joe', 'Patrick', 'Donald', 'Eric', 'Joe'];

    // SELECT name FROM sample1 WHERE LENGTH(name) < 5
    $under5 = Ginq::from($sample1)
        ->where(function($name){return strlen($name) < 5;})
        ->toArray();

    // SELECT DISTINCT name FROM sample1 ORDER BY id DESC
    $reverse = Ginq::from($sample1)->reverse()->distinct()->toArray();

    // Employee PHPLinqのサンプルのコピペ
    class Employee {
        public $Id, $DepartmentId, $ManagerId, $Name, $Email, $Age;
        public function __construct($id = 0, $departmentId = 0, $managerId = 0, $name = '', $email = '', $age = '') {
            $this->Id               = $id;
            $this->DepartmentId     = $departmentId;
            $this->ManagerId        = $managerId;
            $this->Name             = $name;
            $this->Email            = $email;
            $this->Age              = $age;
        }
    }
    $employees = [
        new Employee(1, 1, 5, 'Maarten', 'maarten@example.com', 24),
        new Employee(2, 1, 5, 'Paul', 'paul@example.com', 30),
        new Employee(3, 2, 5, 'Bill', 'bill.a@example.com', 29),
        new Employee(4, 3, 5, 'Bill', 'bill.g@example.com', 28),
        new Employee(5, 2, 0, 'Xavier', 'xavier@example.com', 40)
    ];

    // SELECT Email, SUBSTR(Email, INSTR(Email,'@')+1) FROM employees WHERE LENGTH(Name) = 4 ORDER BY Age DESC LIMIT 2 OFFSET 1
    $result = Ginq::from($employees)
        ->where(function($employee){ return strlen($employee->Name) === 4; })
        ->orderByDesc(function($employee){ return $employee->Age; })
        ->drop(1)->take(2)
        ->select(function($employee){ return [
            'EmailAddress' => $employee->Email,
            'Domain' => substr($employee->Email, strpos($employee->Email, "@") + 1)
            ]; })
        ->toArray();

可以使用方法链来像写SQL一样的方式处理几乎与注释中写的SQL相同的操作。
虽然不是SQL本身,但可以以相同的方式使用。
无需使用array_filter()和foreach这样繁琐的处理步骤。

这个版本的PHPLinq与上一版本几乎相同,但是由于from方法可以接受Iterator,所以可以用ArrayObject和SPL等作为参数。
此外,大多数方法都可以接受callable参数,相比需要用字符串编写的PHPLinq,更加方便且具有通用性。

嗯,如果看这幅幻灯片,大致就能了解 Ginq 的功能。
虽然本次没有使用,但还有很多其他功能,如聚合、连接等,而且还支持延迟执行,性能似乎也很不错。
看起来是一个相当方便易用的库。

广告
将在 10 秒后关闭
bannerAds