2016-11-16 121 views
1

我正在使用laravel侦察员上传记录以在algolia中搜索。我已将搜索到的特征添加到我的模型中,并且一切正常。从laravel scout/algolia中排除特定记录

现在有一种情况,我不希望将某些记录添加到我的索引中,如果它们已设置状态I.E UNPUBLISHED。

在那里我可以评估状态字段并决定是否要将模型上传到索引?

回答

0

只需使用$model_name->unsearchable()即可将其从Algolia索引中移除。

详情请参见该文档中的“删除记录”:https://laravel.com/docs/5.3/scout#removing-records

+0

我知道我可以在模型保存上做到这一点,我希望能够在模型本身中嵌入functionilty以保持整洁。 – JaChNo

1

您可以使用方法toSearchableData()并且如果状态为未出版,只是返回空数组和记录将被跳过。 否则只是返回$this->toArray()

它会做的。

+0

如果我这样做,它仍然会打电话给agolia,但它是空白的。有没有办法阻止它呼出? – JaChNo

0

说我们有一个邮政模型,用布尔发表属性和模型厂播种我们的表如下:

$factory->define(App\Post::class, function (Faker\Generator $faker) { 
    $tile = $faker->realText(50); 
    $date = $faker->dateTime; 

    return [ 
     'title'  => $tile, 
     'body'  => $faker->realText(500), 
     'published' => $faker->boolean(80), 
     'created_at' => $date, 
     'updated_at' => $date 
    ]; 
}); 

比方说,我们将播种10条记录。

public function run() 
{ 
    factory(App\Article::class, 10)->create(); 
} 

如果我们试图将toSearchableArray()方法中排除未公布记载,建议:

public function toSearchableArray() 
{ 
    if (! $this->published) { 
     return[]; 
    } 

    // ... 
} 

当无欲无求帖子表,而不是忽略未公布记录通过返回一个空阵列,侦察员将不断向模型工厂询问发布的模型。

例如,如果两个种子纪录是随机未公布,侦察员将指数的所有10条(而不是8)无论如何,通过一个新的模型厂(用更换未发表那些发表集属性)。因此导致在algolia指数中有两个不存在的(在我们的表上)记录。非常混乱。

围绕这个我可以想到的“最新”方法是在模型的引导方法中听取保存/更新的事件(保存/更新不会削减它)。

protected static function boot() 
{ 
    static::saved(function ($model) { 
     if (! $model->published) { 
      $model->unsearchable(); 
     } 
    }); 

    static::updated(function ($model) { 
     if (! $model->published) { 
      $model->unsearchable(); 
     } 
    }); 

    parent::boot(); 
}