| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | <?php/** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */namespace yii\db\conditions;use yii\base\InvalidArgumentException;use yii\db\ExpressionBuilderInterface;use yii\db\ExpressionBuilderTrait;use yii\db\ExpressionInterface;/** * Class LikeConditionBuilder builds objects of [[LikeCondition]] * * @author Dmytro Naumenko <d.naumenko.a@gmail.com> * @since 2.0.14 */class LikeConditionBuilder implements ExpressionBuilderInterface{    use ExpressionBuilderTrait;    /**     * @var array map of chars to their replacements in LIKE conditions.     * By default it's configured to escape `%`, `_` and `\` with `\`.     */    protected $escapingReplacements = [        '%' => '\%',        '_' => '\_',        '\\' => '\\\\',    ];    /**     * @var string|null character used to escape special characters in LIKE conditions.     * By default it's assumed to be `\`.     */    protected $escapeCharacter;    /**     * Method builds the raw SQL from the $expression that will not be additionally     * escaped or quoted.     *     * @param ExpressionInterface|LikeCondition $expression the expression to be built.     * @param array $params the binding parameters.     * @return string the raw SQL that will not be additionally escaped or quoted.     */    public function build(ExpressionInterface $expression, array &$params = [])    {        $operator = strtoupper($expression->getOperator());        $column = $expression->getColumn();        $values = $expression->getValue();        $escape = $expression->getEscapingReplacements();        if ($escape === null || $escape === []) {            $escape = $this->escapingReplacements;        }        list($andor, $not, $operator) = $this->parseOperator($operator);        if (!is_array($values)) {            $values = [$values];        }        if (empty($values)) {            return $not ? '' : '0=1';        }        if (strpos($column, '(') === false) {            $column = $this->queryBuilder->db->quoteColumnName($column);        }        $escapeSql = $this->getEscapeSql();        $parts = [];        foreach ($values as $value) {            if ($value instanceof ExpressionInterface) {                $phName = $this->queryBuilder->buildExpression($value, $params);            } else {                $phName = $this->queryBuilder->bindParam(empty($escape) ? $value : ('%' . strtr($value, $escape) . '%'), $params);            }            $parts[] = "{$column} {$operator} {$phName}{$escapeSql}";        }        return implode($andor, $parts);    }    /**     * @return string     */    private function getEscapeSql()    {        if ($this->escapeCharacter !== null) {            return " ESCAPE '{$this->escapeCharacter}'";        }        return '';    }    /**     * @param string $operator     * @return array     */    protected function parseOperator($operator)    {        if (!preg_match('/^(AND |OR |)(((NOT |))I?LIKE)/', $operator, $matches)) {            throw new InvalidArgumentException("Invalid operator '$operator'.");        }        $andor = ' ' . (!empty($matches[1]) ? $matches[1] : 'AND ');        $not = !empty($matches[3]);        $operator = $matches[2];        return [$andor, $not, $operator];    }}
 |