hardeep-vicky/php-query-builder
Composer 安装命令:
composer require hardeep-vicky/php-query-builder
包简介
Query builder Tool for Php
README 文档
README
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 jeremy@jeremydorn.com 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 hardeepvicky1@gmail.com OR at hardeep.singh417@gmail.com
Installation
Install Library using composer
composer require hardeep-vicky/php-query-builder
Basic Usage/Examples
- 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
SELECT
C.*
FROM
countries AS C
WHERE
(C.name like '%india%')
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
SELECT
C.*
FROM
`countries` AS C
WHERE
(
region = 'Asia'
AND (
C.name like '%india%' OR C.name like '%pakistan%'
)
)
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
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
$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
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
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
We have two options here
$join_city->setWhere( Condition::init("OR") ->add("name", "%ludhiana%", "like") ->add("name", "%delhi%", "like") );
Output
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
$join_city->addRawWhere("AND (S.name = City.name)");
Output
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
$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
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
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
I'm a PHP Developer creating web applications and php libraries since 2014. Contact me at hardeepvicky1@gmail.com OR at hardeep.singh417@gmail.com
License
Authors
统计信息
- 总下载量: 425
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 1
- 点击次数: 0
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2019-02-09