在PHP中使用LINQ

Ginq / PHPLinq 可以进行 paraphrase.

我将尝试使用PHP Linq库来实现类似LINQ的功能。

“LINQ到底是什么东西呢?
https://zh.wikipedia.org/wiki/LINQ”

通过标准化的方式,使得可以查询数据集合的数据。

.NET Framework现在添加了通用查询功能,这个查询功能适用于各种信息源,不仅限于关系型数据和XML数据。

怎么回事呢。
简单地说,这东西貌似可以用类似 SQL 的语句来对数组、对象以及其他各种集合进行 SELECT 操作。
我们立刻来试试看。

<?php
    // Linq include_path設定が必要
    set_include_path(get_include_path() . PATH_SEPARATOR . 'path/to/phplinq/Classes');
    require_once 'path/to/phplinq/Classes/PHPLinq/LinqToObjects.php';

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

    // SELECT name FROM sample1 WHERE LENGTH(name) < 5
    $result = from('$name')->in($sample1)
        ->where('strlen($name) < 5')
        ->select('$name');

    // SELECT DISTINCT name FROM sample1 ORDER BY id DESC
    $result = from('$name')->in($sample1)->reverse()->distinct('$name')->select();

    // Employee サンプルのコピペ
    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 = from('$employee')->in($employees)
        ->where('$employee => strlen($employee->Name) === 4')
        ->orderByDescending('$employee->Age')
        ->skip(1)->take(2)
        ->select('new {
            "EmailAddress" => $employee->Email,
            "Domain" => substr($employee->Email, strpos($employee->Email, "@") + 1)
        }');

现在可以使用方法链以类似SQL的方式编写几乎与评论中所写的SQL相同的处理。虽然不是SQL本身,但可以以类似的方式使用。不再需要编写繁琐的处理,如使用array_filter()和foreach进行提取。

一見来说是方便的,但缺点是只支持数组和Zend_Db。
源码中有Adapter/Mysqli和Adapter/Pdo/Mysql等东西,所以以为可以传入PDO,但奇怪的是需要Zend_Db_Adapter。
另外,ArrayObject几乎就是数组,但也不支持。
示例中还有处理RSS XML的例子,但只是用SimpleXMLElement::xpath()将其转换为数组然后传入。
如果支持更广泛,就会越来越方便,但在2009年左右停止了开发。
遗憾。

广告
将在 10 秒后关闭
bannerAds