我正在使用laravel scout上传记录以便在algolia中搜索。我已将可搜索的特征添加到我的模型中,一切正常。
现在有一种情况我不想在我的索引中添加某些记录,如果他们已设置状态I.E UNPUBLISHED。
在那里我可以评估状态字段并决定是否要将模型上传到索引?
答案 0 :(得分:1)
只需使用$model_name->unsearchable()
将其从Algolia索引中删除。
请参阅"删除记录"在文档中有更多详细信息:https://laravel.com/docs/5.3/scout#removing-records
答案 1 :(得分:1)
您可以使用方法toSearchableData()
,如果状态为Unpublished,只返回空数组,将跳过记录。
否则只需返回$this->toArray()
。
它会起作用。
答案 2 :(得分: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[];
}
// ...
}
播种帖子表时,scout将继续向模型工厂询问已发布的,而不是忽略未发布的记录>模特。
例如,如果两个种子记录随机未发布,则scout会将所有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();
}
答案 3 :(得分:0)
看看这个问题。这个问题已在Scout的新版本中得到解决 Adding Index to Laravel Scout Conditionally (Algolia)