Helper methods of node classes
Most of the Node impplementations don’t add new API except for declaring properties and internal methods to support
those. The few that have extra methods are described here.
SelectCommon
Common subclass for SELECT and VALUES statements. It has union(), intersect(), and except()
methods for combining the current statement with another one using set operators.
These are described in the section dealing with SelectCommon.
nodes\range\FromElement
This is an abstract base class for elements appearing in FROM and similar SQL clauses.
It defines methods for joining another FROM element to the current one.
namespace sad_spirit\pg_builder\nodes\range;
use sad_spirit\pg_builder\enums\JoinType;
use sad_spirit\pg_builder\nodes\GenericNode;
abstract class FromElement extends GenericNode
{
public function join(self|string $fromElement, JoinType $joinType = JoinType::INNER) : JoinExpression;
public function innerJoin(self|string $fromElement) : JoinExpression;
public function crossJoin(self|string $fromElement) : JoinExpression;
public function leftJoin(self|string $fromElement) : JoinExpression;
public function rightJoin(self|string $fromElement) : JoinExpression;
public function fullJoin(self|string $fromElement) : JoinExpression;
}
join()Creates a
JOINbetween this element and another one using given join type. The type is represented by a case of string-backedJoinTypeenum.innerJoin()/crossJoin()/leftJoin()/rightJoin()/fullJoin()These are shorthand methods for
join(), passing, respectivelyJoinType::INNER,JoinType::CROSS,JoinType::LEFT,JoinType::RIGHT, andJoinType::FULLfor its second argument.
If these methods are called on an element that is already a part of bigger AST then result will replace the original element:
use sad_spirit\pg_builder\{
StatementFactory,
Select
};
$factory = new StatementFactory();
/** @var Select $select */
$select = $factory->createFromString(
'select foo.*, bar.* from foo, bar where foo.id = bar.id'
);
$select->from[0]->leftJoin('baz')->on = 'foo.id = baz.foo_id';
$select->list[] = 'baz.*';
echo $factory->createFromAST($select)->getSql();
will output
select foo.*, bar.*, baz.*
from foo left join baz on foo.id = baz.foo_id, bar
where foo.id = bar.id
nodes\WhereOrHavingClause
This is a wrapper around an object implementing nodes\ScalarExpression that represents the WHERE condition of
SELECT / UPDATE / DELETE or HAVING condition of SELECT.
It contains methods for combining parts of the condition with logical AND and OR operators.
namespace sad_spirit\pg_builder\nodes;
/**
* @property ScalarExpression|null $condition
*/
class WhereOrHavingClause extends GenericNode
{
public function and(self|string|ScalarExpression|null $condition) : $this;
public function or(self|string|ScalarExpression|null $condition) : $this;
public function nested(self|string|ScalarExpression $condition) : self;
}
$conditionThe actual wrapped condition, this property is writable and can accept strings as input. Setting it will completely replace the condition.
and()Adds a condition to the clause using
ANDoperator.or()Adds a condition to the clause using
ORoperator.nested()Helper method for creating nested conditions. Basically this allows adding parentheses to logical expressions.
use sad_spirit\pg_builder\{
StatementFactory,
Select
};
$factory = new StatementFactory();
/** @var Select $select */
$select = $factory->createFromString(
'select * from foo where blah'
);
$select->where->condition = 'foo_one = 1';
$select->where->and('foo_two = 2');
$select->where->or("foo_title ~ 'foo'");
$select->where->and(
$select->where->nested("foo_pubdate > 'yesterday'")
->or("foo_important")
);
echo $factory->createFromAST($select)->getSql();
outputs
select *
from foo
where foo_one = 1
and foo_two = 2
or foo_title ~ 'foo'
and (
foo_pubdate > 'yesterday'
or foo_important
)