_castToExpression($from, $type); $to = $this->_castToExpression($to, $type); } $this->_field = $field; $this->_from = $from; $this->_to = $to; $this->_type = $type; } /** * Converts the expression to its string representation * * @param \Cake\Database\ValueBinder $generator Placeholder generator object * @return string */ public function sql(ValueBinder $generator) { $parts = [ 'from' => $this->_from, 'to' => $this->_to ]; $field = $this->_field; if ($field instanceof ExpressionInterface) { $field = $field->sql($generator); } foreach ($parts as $name => $part) { if ($part instanceof ExpressionInterface) { $parts[$name] = $part->sql($generator); continue; } $parts[$name] = $this->_bindValue($part, $generator, $this->_type); } return sprintf('%s BETWEEN %s AND %s', $field, $parts['from'], $parts['to']); } /** * {@inheritDoc} * */ public function traverse(callable $callable) { foreach ([$this->_field, $this->_from, $this->_to] as $part) { if ($part instanceof ExpressionInterface) { $callable($part); } } } /** * Registers a value in the placeholder generator and returns the generated placeholder * * @param mixed $value The value to bind * @param \Cake\Database\ValueBinder $generator The value binder to use * @param string $type The type of $value * @return string generated placeholder */ protected function _bindValue($value, $generator, $type) { $placeholder = $generator->placeholder('c'); $generator->bind($placeholder, $value, $type); return $placeholder; } /** * Do a deep clone of this expression. * * @return void */ public function __clone() { foreach (['_field', '_from', '_to'] as $part) { if ($this->{$part} instanceof ExpressionInterface) { $this->{$part} = clone $this->{$part}; } } } }