Build Quality Coverage Release License

PINQ

PHP Integrated query

View project onGitHub

What is PINQ?

Based off the .NET's LINQ (Language integrated query), PINQ unifies querying across arrays/iterators and external data sources, in a single readable and concise fluent API.

A quick example

The following shows an example query using the PINQ library:

$youngPeopleDetails = $people
        ->where(function ($row) { return $row['age'] <= 50; })
        ->orderByAscending(function ($row) { return $row['firstName']; })
        ->thenByAscending(function ($row) { return $row['lastName']; })
        ->take(50)
        ->indexBy(function ($row) { return $row['phoneNumber']; })
        ->select(function ($row) { 
            return [
                'fullName'     => $row['firstName'] . ' ' . $row['lastName'],
                'address'       => $row['address'],
                'dateOfBirth' => $row['dateOfBirth'],
            ]; 
        })

The beauty of PINQ is as follows, the above query may be executing against a set of arrays or possibly against database table. PINQ blurs the lines between in-memory and external data-source, using the most powerful and natural language available to PHP developers: ... PHP.

Why PINQ?

Considering the vast number of LINQ implementations currently available for php, why another? Besides the fact most of the others are incomplete/broken without a maintainer nor contributors, they are not real LINQ implementations. Sure, offering some nice array handling syntax is cool, but not only what LINQ is about. PINQ aims to provide:

  • Well structured and tested code base
  • Full composer and PSR-4 support
  • Complete and thorough documentation
  • LINQ-style fluent query API with lazy evaluation and immutable query objects
  • Truly seamless external query support
  • Full support for PHP closures and callable syntax (No magic strings)
  • And even building on the original LINQ with offering an additional mutable query API

Installation

Add the package to your composer.json:

{
    "require": {
        "timetoogo/pinq": "~3.0"
    }
}