isExpression($table)) { return $this->wrap($this->tablePrefix . $table, true); } return $this->getValue($table); } /** * Wrap a value in keyword identifiers. * * @param bool $prefixAlias * @return string */ public function wrap(Expression|string $value, $prefixAlias = false) { if ($this->isExpression($value)) { return $this->getValue($value); } // If the value being wrapped has a column alias we will need to separate out // the pieces so we can wrap each of the segments of the expression on its // own, and then join these both back together using the "as" connector. if (stripos($value, ' as ') !== false) { return $this->wrapAliasedValue($value, $prefixAlias); } return $this->wrapSegments(explode('.', $value)); } /** * Convert an array of column names into a delimited string. */ public function columnize(array $columns): string { return implode(', ', array_map([$this, 'wrap'], $columns)); } /** * Create query parameter place-holders for an array. */ public function parameterize(array $values): string { return implode(', ', array_map([$this, 'parameter'], $values)); } /** * Get the appropriate query parameter place-holder for a value. * * @return string */ public function parameter(mixed $value) { return $this->isExpression($value) ? $this->getValue($value) : '?'; } /** * Quote the given string literal. * * @param array|string $value */ public function quoteString($value): string { if (is_array($value)) { return implode(', ', array_map([$this, __FUNCTION__], $value)); } return "'{$value}'"; } /** * Determine if the given value is a raw expression. */ public function isExpression(mixed $value): bool { return $value instanceof Expression; } /** * Get the value of a raw expression. * * @return string */ public function getValue(Expression $expression) { return $expression->getValue(); } /** * Get the format for database stored dates. */ public function getDateFormat(): string { return 'Y-m-d H:i:s'; } /** * Get the grammar's table prefix. */ public function getTablePrefix(): string { return $this->tablePrefix; } /** * Set the grammar's table prefix. * * @return $this */ public function setTablePrefix(string $prefix): static { $this->tablePrefix = $prefix; return $this; } /** * Wrap a value that has an alias. * * @param string $value * @param bool $prefixAlias * @return string */ protected function wrapAliasedValue($value, $prefixAlias = false) { $segments = preg_split('/\s+as\s+/i', $value); // If we are wrapping a table we need to prefix the alias with the table prefix // as well in order to generate proper syntax. If this is a column of course // no prefix is necessary. The condition will be true when from wrapTable. if ($prefixAlias) { $segments[1] = $this->tablePrefix . $segments[1]; } return $this->wrap( $segments[0] ) . ' as ' . $this->wrapValue( $segments[1] ); } /** * Wrap the given value segments. * * @param array $segments */ protected function wrapSegments($segments): string { return collect($segments)->map(function ($segment, $key) use ($segments) { return $key == 0 && count($segments) > 1 ? $this->wrapTable($segment) : $this->wrapValue($segment); })->implode('.'); } /** * Wrap a single string in keyword identifiers. * * @param string $value */ protected function wrapValue($value): string { if ($value !== '*') { return '"' . str_replace('"', '""', $value) . '"'; } return $value; } }