Skip to content

[13.x] Add orderByFullText to the query builder#59611

Closed
dxnter wants to merge 1 commit intolaravel:13.xfrom
dxnter:feat/order-by-fulltext-relevance
Closed

[13.x] Add orderByFullText to the query builder#59611
dxnter wants to merge 1 commit intolaravel:13.xfrom
dxnter:feat/order-by-fulltext-relevance

Conversation

@dxnter
Copy link
Copy Markdown
Contributor

@dxnter dxnter commented Apr 9, 2026

Summary

whereFullText() filters by relevance but can't sort by it. Ranking results requires raw, database-specific SQL. This adds orderByFullText().

Before

// PostgreSQL - single column
Post::whereFullText('body', 'laravel')
    ->orderByRaw("ts_rank(to_tsvector('english', body), plainto_tsquery('english', ?)) desc", ['laravel'])
    ->get();

// PostgreSQL - multiple columns
Post::whereFullText(['title', 'body'], 'laravel')
    ->orderByRaw("ts_rank(to_tsvector('english', title) || to_tsvector('english', body), plainto_tsquery('english', ?)) desc", ['laravel'])
    ->get();

// MySQL - single column
Post::whereFullText('body', 'laravel')
    ->orderByRaw("match (body) against (? in natural language mode) desc", ['laravel'])
    ->get();

// MySQL - multiple columns
Post::whereFullText(['title', 'body'], 'laravel')
    ->orderByRaw("match (title, body) against (? in natural language mode) desc", ['laravel'])
    ->get();

After

// Single column - works on both PostgreSQL and MySQL
Post::whereFullText('body', 'laravel')
    ->orderByFullText('body', 'laravel')
    ->get();

// Multiple columns
Post::whereFullText(['title', 'body'], 'laravel')
    ->orderByFullText(['title', 'body'], 'laravel')
    ->get();

// With language (PostgreSQL)
Post::whereFullText('body', 'laravel', ['language' => 'french'])
    ->orderByFullText('body', 'laravel', ['language' => 'french'])
    ->get();

// With search mode (PostgreSQL)
Post::whereFullText('body', '+laravel -ruby', ['mode' => 'websearch'])
    ->orderByFullText('body', '+laravel -ruby', ['mode' => 'websearch'])
    ->get();

// Ascending (lowest relevance first)
Post::orderByFullText('body', 'laravel', [], 'asc')->get();

Supports PostgreSQL (ts_rank) and MySQL (MATCH ... AGAINST as a relevance score). Defaults to desc.

@dxnter dxnter force-pushed the feat/order-by-fulltext-relevance branch from 1c58df2 to f23b961 Compare April 9, 2026 13:30
@taylorotwell
Copy link
Copy Markdown
Member

Laravel Scout does this for you automatically when using the database driver. 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants