Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

blixary's avatar

Spatie Query Builder combined search

I'm using the Query Builder for building a search functionality for a index table. My members table has a 'first_name' and a 'last_name' column, which are populated separetly.

For the search functionality, I want my users be able to search for the 'first_name' and 'last_name' combined as full_name. On my Member Model, there is a function fullName() which is giving the correct fullname.

But, sadly, I don't now how to implement that into the Query Builder and the global search. My code at this point is:

$globalSearch = AllowedFilter::callback('global', function ($query, $value) {
            $query->where(function ($query) use ($value) {
                Collection::wrap($value)->each(function ($value) use ($query) {
                    $query
                        ->orWhere('first_name', 'LIKE', "%{$value}%")
                        ->orWhere('last_name', 'LIKE', "%{$value}%")
                        ->orWhere('mail_address', 'LIKE', "%{$value}%");
                });
            });
        });`

        $members = QueryBuilder::for(\App\Models\Member::class)
            ->select(['first_name', 'last_name', 'mail_address'])
            ->allowedSorts(['first_name', 'last_name', 'mail_address'])
            ->allowedFilters([$globalSearch])
            ->paginate(15)

I would be so glad if somebody could help me.

0 likes
2 replies
Thunderson's avatar
Level 2
$globalSearch = AllowedFilter::callback('global', function ($query, $value) {
            $query->where(function ($query) use ($value) {
                Collection::wrap($value)->each(function ($value) use ($query) {
                    $query->orWhereRaw("CONCAT(`first_name`,' ',`last_name`) LIKE ?", ['%'.$value.'%'])
                        ->orWhere('mail_address', 'LIKE', "%{$value}%");
                });
            });
        });`

        $members = QueryBuilder::for(\App\Models\Member::class)
            ->select(['first_name', 'last_name', 'mail_address'])
            ->allowedSorts(['first_name', 'last_name', 'mail_address'])
            ->allowedFilters([$globalSearch])
            ->paginate(15)
2 likes

Please or to participate in this conversation.