{"record":{"id":"08281a7cd067f827","repo":"mongodb/laravel-mongodb","slug":"order-direction-must-be-asc-desc-or-a-case-from-the","errorCode":null,"errorMessage":"Order direction must be \"asc\", \"desc\" or a case from the SortDirection enum.","messagePattern":"Order direction must be \"asc\", \"desc\" or a case from the SortDirection enum\\.","errorType":"exception","errorClass":"InvalidArgumentException","httpStatus":null,"severity":"error","filePath":"src/Query/Builder.php","lineNumber":683,"sourceCode":"    /**\n     * @param SortDirection|int|string|array $direction\n     *\n     * @inheritdoc\n     */\n    #[Override]\n    public function orderBy($column, $direction = 'asc')\n    {\n        if ($direction instanceof SortDirection) {\n            $direction = match ($direction) {\n                SortDirection::Ascending => 1,\n                SortDirection::Descending => -1,\n                default => throw new InvalidArgumentException('Unexpected SortDirection enum case.'),\n            };\n        } elseif (is_string($direction)) {\n            $direction = match ($direction) {\n                'asc', 'ASC' => 1,\n                'desc', 'DESC' => -1,\n                default => throw new InvalidArgumentException('Order direction must be \"asc\", \"desc\" or a case from the SortDirection enum.'),\n            };\n        }\n\n        $column = (string) $column;\n        if ($column === 'natural') {\n            $this->orders['$natural'] = $direction;\n        } else {\n            $this->orders[$column] = $direction;\n        }\n\n        return $this;\n    }\n\n    /**\n     * Override Illuminate's removeExistingOrdersFor to support associative order storage used by MongoDB.\n     *\n     * @inheritdoc\n     */","sourceCodeStart":665,"sourceCodeEnd":701,"githubUrl":"https://github.com/mongodb/laravel-mongodb/blob/0634653039468ceb0268a69192bdac64469ed043/src/Query/Builder.php#L665-L701","documentation":"When the direction argument of orderBy() is a string, it must be 'asc', 'ASC', 'desc' or 'DESC'. Any other string is rejected with this InvalidArgumentException rather than silently producing a wrong sort.","triggerScenarios":"->orderBy('created_at', 'ascending'), ->orderBy('name', 'DESC ', 'ASC', '1', '-1', or locale variants like 'aufsteigend'.","commonSituations":"Dynamic direction taken from request query params without normalization, or copying Eloquent/SQL styles ('ASC' is fine, but 'ascending' is not).","solutions":["Use 'asc'/'desc' (any case is handled for those exact words).","Normalize input: in_array(strtolower($dir), ['asc','desc']) or match to SortDirection before calling.","Pass the SortDirection enum instead of a string for type safety."],"exampleFix":"// before\n$query->orderBy('name', $request->get('dir', 'ascending'));\n// after\n$dir = $request->get('dir', 'asc') === 'desc' ? 'desc' : 'asc';\n$query->orderBy('name', $dir);","handlingStrategy":"validation","validationCode":"$dir = is_string($direction) ? strtolower($direction) : $direction;\nif (is_string($dir) && ! in_array($dir, ['asc', 'desc'], true)) {\n    throw new InvalidArgumentException('Direction must be asc or desc');\n}\n$query->orderBy($column, $dir);","typeGuard":"function normalizeSortDirection(mixed $d): string {\n    return is_string($d) && in_array(strtolower($d), ['asc','desc'], true) ? strtolower($d) : 'asc';\n}","tryCatchPattern":"try {\n    $query->orderBy($column, $direction);\n} catch (InvalidArgumentException $e) {\n    if (str_contains($e->getMessage(), 'Order direction must be')) {\n        $query->orderBy($column, 'asc');\n    } else { throw $e; }\n}","preventionTips":["Normalize user-supplied direction to 'asc'/'desc' before calling orderBy","Whitelist direction values in controllers handling sort params","Use the SortDirection enum for internal calls","Add tests for case and whitespace variants of direction input"],"tags":["sort","order-by","validation"],"backgroundTag":"invalid-enum-value","analyzedSha":"0634653039468ceb0268a69192bdac64469ed043","analyzedAt":"2026-09-15T02:56:37.067Z","contentChangedAt":"2026-09-15T02:56:37.067Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}