Laravel Scout 为自定义引擎添加 with 预加载

首先为 Laravel\Scout\Builder 生成宏命令

Builder::macro('with', function ($relations) {

    $eagerLoad = $this->model->with($relations)->getEagerLoads();

    $this->engine()->eagerLoad = array_merge($this->engine()->eagerLoad, $eagerLoad);

    return $this;
});

然后在 Engine 类型添加如下属性, 并修改 map() 方法:

class ElasticsearchEngine extends Engine
{
    public $eagerLoad = [];
    
    public function map(Builder $builder, $results, $model)
    {
        ## 之前的逻辑

        if(!$this->eagerLoad) return $collect;

        $models = $model->setEagerLoads($this->eagerLoad)->eagerLoadRelations($collect->all());
        return $model->newCollection($models);
    }

}

你可能感兴趣的:(Laravel Scout 为自定义引擎添加 with 预加载)