Felix
Felix

Reputation: 2661

Laravel Scout - pagination eager loading

How do I eager load with Laravel Scout?

Here is my query:

$results = Submission::search($query, function ($meilisearch, $query, $options) use ($request) {
    $resultsFilter = '';
                
    if ($subchan = $request->input('subchan')) {
        $resultsFilter = appendToFilter($resultsFilter, 'subchan = ' . $subchan);
    }
    
    if ($incl_nsfw = $request->input('incl_nsfw')) {
        if ($incl_nsfw != 1) {      
            $resultsFilter = appendToFilter($resultsFilter, 'nsfw != 1');
        } 
    } else {
        $resultsFilter = appendToFilter($resultsFilter, 'nsfw != 1');
    }   

    if ($time = $request->input('time')) {
        $nowTimestamp = strtotime(Carbon\Carbon::now());
        $timeString = $time;
        switch ($time) {
            case "hour":
                $resultsFilter = appendToFilter($resultsFilter, 'created_at_ts > ' . $nowTimestamp - 3600);
                break;
            case "day":
                $resultsFilter = appendToFilter($resultsFilter, 'created_at_ts > ' . $nowTimestamp - 86400);
                break;  
            case "week":
                $resultsFilter = appendToFilter($resultsFilter, 'created_at_ts > ' . $nowTimestamp - 604800);
                break;      
            case "month":
                $resultsFilter = appendToFilter($resultsFilter, 'created_at_ts > ' . $nowTimestamp - 2592000);
                break;
            case "year":
                $resultsFilter = appendToFilter($resultsFilter, 'created_at_ts > ' . $nowTimestamp - 31536000);
                break;                      
        }
    }

    if ($resultsFilter != '') {
        $options['filters'] = $resultsFilter;
    }
    return $meilisearch->search($query, $options);
})  

->paginate(15)
->withQueryString();    

but since this uses the Scout builder, traditional eager loading a relationship is not possible. For reference I'm using Meilisearch.

Upvotes: 0

Views: 954

Answers (2)

Bonge
Bonge

Reputation: 21

You could also use the query() method and pass a callback

Submission::search($query)->query(fn(Builder $query) => $query->with('relationship'))->get()

The search results will include the eager loaded relationships

Upvotes: 2

Felix
Felix

Reputation: 2661

Figured it out! It has to be done after the query, like so:

$results->load('owner', 'savedSubmissions');

as opposed to regular eager loading, since Scout uses its own builder.

Upvotes: 0

Related Questions