SqlParser\Utils\Query::replaceClauses PHP Method

replaceClauses() public static method

Builds a query by rebuilding the statement from the tokens list supplied and replaces multiple clauses.
public static replaceClauses ( Statement $statement, TokensList $list, array $ops ) : string
$statement SqlParser\Statement The parsed query that has to be modified.
$list SqlParser\TokensList The list of tokens.
$ops array Clauses to be replaced. Contains multiple arrays having two values: array($old, $new). Clauses must be sorted.
return string
    public static function replaceClauses($statement, $list, array $ops)
    {
        $count = count($ops);
        // Nothing to do.
        if ($count === 0) {
            return '';
        }
        /**
         * Value to be returned.
         *
         * @var string $ret
         */
        $ret = '';
        // If there is only one clause, `replaceClause()` should be used.
        if ($count === 1) {
            return static::replaceClause($statement, $list, $ops[0][0], $ops[0][1]);
        }
        // Adding everything before first replacement.
        $ret .= static::getClause($statement, $list, $ops[0][0], -1) . ' ';
        // Doing replacements.
        for ($i = 0; $i < $count; ++$i) {
            $ret .= $ops[$i][1] . ' ';
            // Adding everything between this and next replacement.
            if ($i + 1 !== $count) {
                $ret .= static::getClause($statement, $list, $ops[$i][0], $ops[$i + 1][0]) . ' ';
            }
        }
        // Adding everything after the last replacement.
        $ret .= static::getClause($statement, $list, $ops[$count - 1][0], 1);
        return $ret;
    }

Usage Example

Beispiel #1
0
 public function testReplaceClauses()
 {
     $this->assertEquals('', Query::replaceClauses(null, null, array()));
     $parser = new Parser('SELECT *, (SELECT 1) FROM film LIMIT 0, 10;');
     $this->assertEquals('SELECT *, (SELECT 1) FROM film WHERE film_id > 0 LIMIT 0, 10', Query::replaceClauses($parser->statements[0], $parser->list, array(array('WHERE', 'WHERE film_id > 0'))));
     $parser = new Parser('SELECT c.city_id, c.country_id ' . 'INTO OUTFILE "/dev/null" ' . 'FROM `city` ' . 'WHERE city_id < 1 ' . 'ORDER BY city_id ASC ' . 'LIMIT 0, 1 ');
     $this->assertEquals('SELECT c.city_id, c.country_id ' . 'INTO OUTFILE "/dev/null" ' . 'FROM city AS c   ' . 'ORDER BY city_id ASC ' . 'LIMIT 0, 10 ', Query::replaceClauses($parser->statements[0], $parser->list, array(array('FROM', 'FROM city AS c'), array('WHERE', ''), array('LIMIT', 'LIMIT 0, 10'))));
 }