_castToExpression($from, $type); $to = $this->_castToExpression($to, $type); } $this->_field = $field; $this->_from = $from; $this->_to = $to; $this->_type = $type; } /** * @inheritDoc */ public function sql(ValueBinder $binder): string { $parts = [ 'from' => $this->_from, 'to' => $this->_to, ]; /** @var \Cake\Database\ExpressionInterface|string $field */ $field = $this->_field; if ($field instanceof ExpressionInterface) { $field = $field->sql($binder); } foreach ($parts as $name => $part) { if ($part instanceof ExpressionInterface) { $parts[$name] = $part->sql($binder); continue; } $parts[$name] = $this->_bindValue($part, $binder, $this->_type); } return sprintf('%s BETWEEN %s AND %s', $field, $parts['from'], $parts['to']); } /** * @inheritDoc */ public function traverse(Closure $callback) { foreach ([$this->_field, $this->_from, $this->_to] as $part) { if ($part instanceof ExpressionInterface) { $callback($part); } } return $this; } /** * Registers a value in the placeholder generator and returns the generated placeholder * * @param mixed $value The value to bind * @param \Cake\Database\ValueBinder $binder The value binder to use * @param string $type The type of $value * @return string generated placeholder */ protected function _bindValue($value, $binder, $type): string { $placeholder = $binder->placeholder('c'); $binder->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}; } } } }