| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- <?php
- namespace Illuminate\Database\Concerns;
- use Illuminate\Support\Str;
- trait CompilesJsonPaths
- {
- /**
- * Split the given JSON selector into the field and the optional path and wrap them separately.
- *
- * @param string $column
- * @return array
- */
- protected function wrapJsonFieldAndPath($column)
- {
- $parts = explode('->', $column, 2);
- $field = $this->wrap($parts[0]);
- $path = count($parts) > 1 ? ', '.$this->wrapJsonPath($parts[1], '->') : '';
- return [$field, $path];
- }
- /**
- * Wrap the given JSON path.
- *
- * @param string $value
- * @param string $delimiter
- * @return string
- */
- protected function wrapJsonPath($value, $delimiter = '->')
- {
- $value = preg_replace("/([\\\\]+)?\\'/", "''", $value);
- $jsonPath = collect(explode($delimiter, $value))
- ->map(fn ($segment) => $this->wrapJsonPathSegment($segment))
- ->join('.');
- return "'$".(str_starts_with($jsonPath, '[') ? '' : '.').$jsonPath."'";
- }
- /**
- * Wrap the given JSON path segment.
- *
- * @param string $segment
- * @return string
- */
- protected function wrapJsonPathSegment($segment)
- {
- if (preg_match('/(\[[^\]]+\])+$/', $segment, $parts)) {
- $key = Str::beforeLast($segment, $parts[0]);
- if (! empty($key)) {
- return '"'.$key.'"'.$parts[0];
- }
- return $parts[0];
- }
- return '"'.$segment.'"';
- }
- }
|