PHPackages                             hardeep-vicky/php-query-builder - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. hardeep-vicky/php-query-builder

ActiveLibrary[Database &amp; ORM](/categories/database)

hardeep-vicky/php-query-builder
===============================

Query builder Tool for Php

1.1.1(2y ago)1424MITPHPPHP &gt;=8.0

Since Sep 24Pushed 2y ago1 watchersCompare

[ Source](https://github.com/hardeepvicky/Php-Query-Builder)[ Packagist](https://packagist.org/packages/hardeep-vicky/php-query-builder)[ RSS](/packages/hardeep-vicky-php-query-builder/feed)WikiDiscussions 1.x Synced 3d ago

READMEChangelog (4)DependenciesVersions (7)Used By (0)

PHP MySQL Query Builder
=======================

[](#php-mysql-query-builder)

This library required when you need to create MySQL Query using classes and arrays. This Library only for creating Select Query For MySQL Databse.

i have used SqlFormatter Library built by **Jeremy Dorn**  to format query in browser.

Feel Free to comment and if any one want to countribute then please contact me **Hardeep Singh** Contact me at  OR at

Installation
------------

[](#installation)

Install Library using composer

```
  composer require hardeep-vicky/php-query-builder
```

Basic Usage/Examples
--------------------

[](#basic-usageexamples)

- First include composer's autoload file.
- QuerySelect class is main class for generating query which accpet a argument of class Table
- Table class accept three arguments
    - First Table name (required)
    - Second Alias (optional)
    - primary field name (optional) (defaull id)

```
require_once './vendor/autoload.php';

use HardeepVicky\QueryBuilder\QuerySelect;
use HardeepVicky\QueryBuilder\Table;
use HardeepVicky\QueryBuilder\Join;
use HardeepVicky\QueryBuilder\Condition;
use HardeepVicky\QueryBuilder\SqlFormatter;

$querySelect = new QuerySelect(new Table("countries"));
# OR
$querySelect = new QuerySelect(new Table("countries", "C"));
# OR
$querySelect = new QuerySelect(new Table("countries", "C", "id"));

$querySelect->setWhere(
        Condition::init("OR")->add("C.name", "%india%", "like")
);

$q = $querySelect->get();

echo $q;
```

Output
------

[](#output)

SELECT C.\* FROM `countries` AS C WHERE (C.name like '%india%')

Use with Complex Conditions
---------------------------

[](#use-with-complex-conditions)

```
require_once './vendor/autoload.php';
use HardeepVicky\QueryBuilder\QuerySelect;
use HardeepVicky\QueryBuilder\Table;
use HardeepVicky\QueryBuilder\Join;
use HardeepVicky\QueryBuilder\Condition;
use HardeepVicky\QueryBuilder\SqlFormatter;

$querySelect = new QuerySelect(new Table("countries", "C"));

$querySelect->setWhere(
        Condition::init("AND")
                ->add("region", "Asia")
                ->addCondition(
                        Condition::init("OR")->add("C.name", "%india%", "like")->add("C.name", "%pakistan%", "like")
                )
);

$q = $querySelect->get();

echo $q;
```

Output
------

[](#output-1)

```
SELECT
  C.*
FROM
  `countries` AS C
WHERE
  (
    region = 'Asia'
    AND (
        C.name like '%india%' OR C.name like '%pakistan%'
    )
)

```

Example with Join
-----------------

[](#example-with-join)

```
$querySelect = new QuerySelect(new Table("countries", "C"));

$join_state = new Join(Join::INNER, new Table("states", "S"), "country_id");

$join_state->field("name");

$querySelect->join($join_state);

$querySelect->setWhere(
        Condition::init("AND")->add("C.name", "india")
);

$querySelect->setLimit(10);

$q = $querySelect->get();

echo SqlFormatter::format($q);
```

Output
------

[](#output-2)

```
SELECT
  C.*,
  S.name
FROM
  `countries` AS C
  INNER JOIN `states` AS S ON S.country_id = C.id
WHERE
  (C.name = 'india')
LIMIT
  10

```

In above example we use Join class , Join class construct function is below

```
class Join
{
    const INNER = 'INNER JOIN';
    const LEFT = 'LEFT JOIN';
    const OUTER = 'OUTER JOIN';

    /**
     * @param String $join_type
     * @param Table $table
     * @param String $foreign_field
     */
    public function __construct(String $join_type, Table $table, String $foreign_field)
    {
```

And we call

```
$join_state->field("name");

```

this statement make select `name` field of states table. This function `field()` has three option

```
$join_state->field("name");   //output S.name
$join_state->field("name", "state_name");  //output S.name as state_name
$join_state->field("name", null, true);  //output S.name as S__name

```

Above options also avialable in QuerySelect class

```
$querySelect->field("name");   //output S.name
$querySelect->field("name", "country_name");  //output C.name as country_name
$querySelect->field("name", null, true);  //output C.name as C__name

```

you can set also no field as below

```
$join_state->noField();

```

```
$querySelect->noField();

```

this statement make no field selction in query

Multiple Join
-------------

[](#multiple-join)

```
$querySelect = new QuerySelect(new Table("countries", "Country"));

$join_city = new Join(Join::LEFT, new Table("cities", "City"), "state_id");
$join_city->field("name");

$join_state = new Join(Join::LEFT, new Table("states", "State"), "country_id");
$join_state->join($join_city);
$join_state->field("name");

$querySelect->join($join_state);

$querySelect->field("id");
$querySelect->field("name");

$q = $querySelect->get();
```

Output
------

[](#output-3)

```
SELECT
  Country.id,
  Country.name,
  State.name,
  City.name
FROM
  `countries` AS Country
  LEFT JOIN `states` AS State ON State.country_id = Country.id
  LEFT JOIN `cities` AS City ON City.state_id = State.id

```

You can get query without alias as below

```
$querySelect = new QuerySelect(new Table("countries"));

$join_city = new Join(Join::LEFT, new Table("cities"), "state_id");
$join_city->field("name");

$join_state = new Join(Join::LEFT, new Table("states"), "country_id");
$join_state->join($join_city);
$join_state->field("name");

$querySelect->join($join_state);

$querySelect->field("id");
$querySelect->field("name");

$q = $querySelect->get();
```

Output
------

[](#output-4)

```
SELECT
  `countries`.id,
  `countries`.name,
  `states`.name,
  `cities`.name
FROM
  `countries`
  LEFT JOIN `states` ON `states`.country_id = `countries`.id
  LEFT JOIN `cities` ON `cities`.state_id = `states`.id

```

Join With Condition
-------------------

[](#join-with-condition)

We have two options here

```
$join_city->setWhere(
        Condition::init("OR")
                ->add("name", "%ludhiana%", "like")
                ->add("name", "%delhi%", "like")

);
```

Output
------

[](#output-5)

```
SELECT
  C.name,
  S.name,
  City.name
FROM
  `countries` AS C
  INNER JOIN `states` AS S ON S.country_id = C.id
  INNER JOIN `cities` AS City ON City.state_id = S.id AND (
      City.name like '%ludhiana%' OR City.name like '%delhi%'
  )

```

### we can concat raw where string as below

[](#we-can-concat-raw-where-string-as-below)

```
$join_city->addRawWhere("AND (S.name = City.name)");
```

### Output

[](#output-6)

```
SELECT
  C.name AS C__name,
  S.name AS S__name,
  City.name AS City__name
FROM
  `countries` AS C
  INNER JOIN `states` AS S ON S.country_id = C.id
  INNER JOIN `cities` AS City ON City.state_id = S.id AND (S.name = City.name)

```

Another Examples are below
--------------------------

[](#another-examples-are-below)

```
$querySelect = new QuerySelect(new Table("countries"));

        $join_state = new Join(Join::LEFT, new Table("states", "S"), "country_id");
        $join_state->noField();

$querySelect->join($join_state);

$querySelect->field("name");

$querySelect->addCustomField("COUNT(S.id) AS state_count");

$querySelect->groupBy("countries.id");

$querySelect->setHaving(Condition::init("AND")->add("state_count", 5, ">"));

$querySelect->order("state_count", "desc");

$querySelect->setLimit(10);

$q = $querySelect->get();

echo SqlFormatter::format($q);
```

In above example we use custom field `$querySelect->addCustomField("COUNT(S.id) AS state_count");`and conditions in having clause `$querySelect->setHaving(Condition::init("AND")->add("state_count", 5, ">"));`

Output
------

[](#output-7)

```
SELECT
  `countries`.name,
  COUNT(S.id) AS state_count
FROM
  `countries`
  LEFT JOIN `states` AS S ON S.country_id = `countries`.id
GROUP BY
  countries.id
HAVING
  (state_count > 5)
ORDER BY
  state_count DESC
LIMIT
  10

```

```
$querySelect = new QuerySelect(new Table("countries", "C"));

                $join_city = new Join(Join::INNER, new Table("cities", "City"), "state_id");
                $join_city->noField();
                $join_city->setWhere(Condition::init("OR"));
                $join_city->addRawWhere("AND (S.name = City.name)");

        $join_state = new Join(Join::INNER, new Table("states", "S"), "country_id");
        $join_state->noField();
        $join_state->join($join_city);

$querySelect->join($join_state);

$querySelect->field("name", null, true);

$querySelect->addCustomField("COUNT(S.name) as same_name_count");

$querySelect->groupBy("C.id");

$querySelect->order("same_name_count", "DESC");

$querySelect->setHaving(Condition::init("AND")->add("C__name", "%india%", "like"));

$q = $querySelect->get();
```

Output
------

[](#output-8)

```
SELECT
  C.name AS C__name,
  COUNT(S.name) as same_name_count
FROM
  `countries` AS C
  INNER JOIN `states` AS S ON S.country_id = C.id
  INNER JOIN `cities` AS City ON City.state_id = S.id
  AND (S.name = City.name)
GROUP BY
  C.id
HAVING
  (C__name like '%india%')
ORDER BY
  same_name_count DESC

```

🚀 About Me
----------

[](#-about-me)

I'm a PHP Developer creating web applications and php libraries since 2014. Contact me at  OR at

License
-------

[](#license)

[MIT](https://choosealicense.com/licenses/mit/)

Authors
-------

[](#authors)

- [Hardeep Singh](https://www.github.com/hardeepvicky)

###  Health Score

26

—

LowBetter than 43% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity14

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 95% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~5 days

Total

6

Last Release

936d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/1ebd02f6cb8285420b2f5a9e03047468be9d88a980fd1df007893d45ce317664?d=identicon)[hardeepvicky](/maintainers/hardeepvicky)

---

Top Contributors

[![hardeepvicky](https://avatars.githubusercontent.com/u/10570623?v=4)](https://github.com/hardeepvicky "hardeepvicky (38 commits)")[![seekex](https://avatars.githubusercontent.com/u/71244401?v=4)](https://github.com/seekex "seekex (2 commits)")

---

Tags

php-query-builder

### Embed Badge

![Health badge](/badges/hardeep-vicky-php-query-builder/health.svg)

```
[![Health](https://phpackages.com/badges/hardeep-vicky-php-query-builder/health.svg)](https://phpackages.com/packages/hardeep-vicky-php-query-builder)
```

###  Alternatives

[doctrine/orm

Object-Relational-Mapper for PHP

10.2k285.3M6.2k](/packages/doctrine-orm)[jdorn/sql-formatter

a PHP SQL highlighting library

3.9k115.1M102](/packages/jdorn-sql-formatter)[illuminate/database

The Illuminate Database package.

2.8k52.4M9.4k](/packages/illuminate-database)[mongodb/mongodb

MongoDB driver library

1.6k64.0M546](/packages/mongodb-mongodb)[ramsey/uuid-doctrine

Use ramsey/uuid as a Doctrine field type.

90340.3M211](/packages/ramsey-uuid-doctrine)[reliese/laravel

Reliese Components for Laravel Framework code generation.

1.7k3.4M16](/packages/reliese-laravel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
