{"record":{"id":"03570e4c0c03a01c","repo":"laravel/framework","slug":"order-direction-must-be-a-sortdirection-asc-or","errorCode":null,"errorMessage":"Order direction must be a SortDirection, \"asc\" or \"desc\".","messagePattern":"Order direction must be a SortDirection, \"asc\" or \"desc\"\\.","errorType":"exception","errorClass":"InvalidArgumentException","httpStatus":null,"severity":"error","filePath":"src/Illuminate/Database/Query/Builder.php","lineNumber":2992,"sourceCode":"     */\n    public function orderBy($column, $direction = SortDirection::Ascending)\n    {\n        if ($this->isQueryable($column)) {\n            [$query, $bindings] = $this->createSub($column);\n\n            $column = new Expression('('.$query.')');\n\n            $this->addBinding($bindings, $this->unions ? 'unionOrder' : 'order');\n        }\n\n        $direction = match (true) {\n            $direction instanceof SortDirection => match ($direction) {\n                SortDirection::Ascending => 'asc',\n                SortDirection::Descending => 'desc',\n            },\n            strtolower($direction) === 'asc' => 'asc',\n            strtolower($direction) === 'desc' => 'desc',\n            default => throw new InvalidArgumentException('Order direction must be a SortDirection, \"asc\" or \"desc\".'),\n        };\n\n        $this->{$this->unions ? 'unionOrders' : 'orders'}[] = [\n            'column' => $column,\n            'direction' => $direction,\n        ];\n\n        return $this;\n    }\n\n    /**\n     * Add a descending \"order by\" clause to the query.\n     *\n     * @param  \\Closure|\\Illuminate\\Database\\Query\\Builder|\\Illuminate\\Database\\Eloquent\\Builder<*>|\\Illuminate\\Contracts\\Database\\Query\\Expression|string  $column\n     * @return $this\n     */\n    public function orderByDesc($column)\n    {","sourceCodeStart":2974,"sourceCodeEnd":3010,"githubUrl":"https://github.com/laravel/framework/blob/e0f6eb3518ac29fbbca8529e97d0df7fc9f24481/src/Illuminate/Database/Query/Builder.php#L2974-L3010","documentation":"orderBy() now normalizes direction through a match expression. It accepts a SortDirection enum, or the case-insensitive strings 'asc'/'desc'; the default arm throws InvalidArgumentException. Earlier forms (integers, 'ascending', custom strings) are no longer tolerated.","triggerScenarios":"->orderBy('created_at', 'ascending'), ->orderBy('name', 1), ->orderBy('col', strtoupper($input)) where $input is neither 'ASC' nor 'DESC'.","commonSituations":"Front-end filter params sent straight into orderBy; legacy code passing 'ascending'/'descending' words or boolean/int flags; user-typed sort values from a query string.","solutions":["Whitelist and translate user input before it reaches orderBy: $dir = in_array($input, ['asc','desc'], true) ? $input : 'asc'.","Use the SortDirection enum for type safety in PHP 8.1+ code.","Reject or normalize unknown sort values at the controller/validation layer."],"exampleFix":"// before\n->orderBy('created_at', $request->sort)  // 'ascending', 'newest', etc.\n\n// after\n$dir = strtolower($request->sort) === 'desc' ? 'desc' : 'asc';\n->orderBy('created_at', $dir)","handlingStrategy":"validation","validationCode":"$dir = in_array(strtolower((string) $input), ['asc', 'desc'], true)\n    ? strtolower($input)\n    : 'asc';\n$query->orderBy($column, $dir);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Whitelist sort direction at the controller/validation layer.","Prefer the SortDirection enum in internal code for compile-time safety.","Reject unknown sort tokens with a 422 instead of forwarding them to orderBy()."],"tags":["query-builder","order-by","database","validation"],"backgroundTag":null,"analyzedSha":"e0f6eb3518ac29fbbca8529e97d0df7fc9f24481","analyzedAt":"2026-08-11T20:52:37.562Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}