/** * Render a Union object * @param Query\Union $query * @return string */ public static function render(Query\Union $query) { return Compiler::withDb($query->getDb(), function () use($query) { return Compiler::expression(array(Arr::join(' UNION ', Arr::map(function (Query\Select $select) { return Compiler::braced(Select::render($select)); }, $query->getSelects())), Compiler::word('ORDER BY', Direction::combine($query->getOrder())), Compiler::word('LIMIT', $query->getLimit()))); }); }
/** * Render a Insert object * @param Query\Insert $query * @return string */ public static function render(Query\Insert $query) { return Compiler::withDb($query->getDb(), function () use($query) { $table = $query->getTable(); $select = $query->getSelect(); return Compiler::expression(array('INSERT', $query->getType(), Compiler::word('INTO', $table !== null ? Aliased::render($table) : null), Columns::render($query->getColumns()), Compiler::word('VALUES', Values::combine($query->getValues())), Compiler::word('SET', Set::combine($query->getSet())), $select !== null ? Select::render($select) : null)); }); }
/** * Render SQL for Aliased * * @param SQL\Aliased $aliased * @return string */ public static function render(SQL\Aliased $aliased) { $content = $aliased->getContent(); if ($content instanceof Query\Select) { $content = "(" . Select::render($content) . ")"; } else { $content = Compiler::name($content); } return Compiler::expression(array($content, Compiler::word('AS', Compiler::name($aliased->getAlias())))); }
/** * @covers ::render * @covers ::parameters */ public function testCompile() { $select2 = new Query\Select(self::getDb()); $select2->from('one')->type('DISTINCT')->join('table1', new SQL('USING (col1, col2)'))->where('table1.name', 'small'); $select = new Query\Select(self::getDb()); $select->from('bigtable')->from('smalltable', 'alias')->from($select2, 'select_alias')->column('col1')->column(new SQL('IF(name = ?, "big", "small")', array(10)), 'type')->column('col3', 'alias_col')->where('bigtable.test', 'value')->whereNot('alias.test', 'some bad val')->whereRaw('test_statement = IF ("test", ?, ?)', array('val1', 'val2'))->join('table2', array('col1' => 'col2'))->whereRaw('type > ? AND type < ? AND base IN ?', array(10, 20, array('1', '2', '3')))->having('test', 'value2')->havingRaw('type > ? AND base IN ?', array(20, array('5', '6', '7')))->limit(10)->offset(8)->order('type', 'ASC')->order('base')->group('base', 'ASC')->group('type'); $expectedSql = <<<SQL SELECT `col1`, IF(name = ?, "big", "small") AS `type`, `col3` AS `alias_col` FROM `bigtable`, `smalltable` AS `alias`, (SELECT DISTINCT * FROM `one` JOIN `table1` USING (col1, col2) WHERE (`table1`.`name` = ?)) AS `select_alias` JOIN `table2` ON `col1` = `col2` WHERE (`bigtable`.`test` = ?) AND (`alias`.`test` != ?) AND (test_statement = IF ("test", ?, ?)) AND (type > ? AND type < ? AND base IN (?, ?, ?)) GROUP BY `base` ASC, `type` HAVING (`test` = ?) AND (type > ? AND base IN (?, ?, ?)) ORDER BY `type` ASC, `base` LIMIT 10 OFFSET 8 SQL; $this->assertEquals($expectedSql, Compiler\Select::render($select)); $expectedParameters = array(10, 'small', 'value', 'some bad val', 'val1', 'val2', '10', '20', '1', '2', '3', 'value2', '20', '5', '6', '7'); $this->assertEquals($expectedParameters, Compiler\Select::parameters($select)); }
/** * Render the value of Set object * @param SQL\Set $item * @return string */ public static function renderValue(SQL\Set $item) { $value = $item->getValue(); $content = $item->getContent(); if ($value instanceof SQL\SQL) { return $value->getContent(); } elseif ($value instanceof Query\Select) { return Compiler::braced(Select::render($value)); } elseif ($item instanceof SQL\SetMultiple and is_string($content)) { return self::renderMultiple($value, $content, $item->getKey()); } else { return '?'; } }
/** * @return array */ public function getParameters() { return Compiler\Select::parameters($this); }