<?php namespace Ulmus\Query; use Ulmus\QueryBuilder; use Ulmus\Repository\ConditionTrait; class Join extends Fragment { use ConditionTrait; const SQL_OUTER = "OUTER"; const SQL_TOKEN = "JOIN"; const TYPE_LEFT = "LEFT"; const TYPE_RIGHT = "RIGHT"; const TYPE_INNER = "INNER"; const TYPE_FULL = "FULL"; const TYPE_CROSS = "CROSS"; const TYPE_NATURAL = "NATURAL"; public bool $outer = false; public array $joins = []; public string $attachment = "ON"; public string $side; public /*string|QueryBuilder*/ $table; public ? string $alias; public string $field; public /*string|QueryBuilder*/ $value; public /* QueryBuilder */ $queryBuilder; public function __construct(QueryBuilder $queryBuilder) { $this->queryBuilder = new QueryBuilder(); $this->queryBuilder->parent = $queryBuilder; } public function set(string $side, /* QueryBuilder|string */ $table, string $field, /* QueryBuilder|string */ $value) { $this->side = $side; $this->table = $table; $this->field = $field; $this->value = $value; } public function render() : string { if ($this->queryBuilder->where ?? false ) { $where = $this->renderSegments([Where::CONDITION_AND, $this->queryBuilder->render(true)]); } return $this->renderSegments([ strtoupper($this->side), $this->outer ? static::SQL_OUTER : "", static::SQL_TOKEN, $this->table, $this->alias ?? "", $this->attachment, $this->field, "=", $this->value, $where ?? "" ]); } }