【发布时间】:2016-11-16 11:39:33
【问题描述】:
我正在使用 laravel scout 上传记录以在 algolia 中进行搜索。我已将可搜索特征添加到我的模型中,一切正常。
现在有一种情况,如果某些记录设置为 I.E UNPUBLISHED,我不想将它们添加到我的索引中。
我是否可以评估状态字段并决定是否要将模型上传到索引?
【问题讨论】:
我正在使用 laravel scout 上传记录以在 algolia 中进行搜索。我已将可搜索特征添加到我的模型中,一切正常。
现在有一种情况,如果某些记录设置为 I.E UNPUBLISHED,我不想将它们添加到我的索引中。
我是否可以评估状态字段并决定是否要将模型上传到索引?
【问题讨论】:
您可以使用方法toSearchableData(),如果状态为未发布,只需返回空数组,记录将被跳过。
否则返回$this->toArray()。
它会成功的。
【讨论】:
只需使用 $model_name->unsearchable() 将其从您的 Algolia 索引中删除。
有关详细信息,请参阅文档中的“删除记录”:https://laravel.com/docs/5.3/scout#removing-records
【讨论】:
假设我们有一个 Post 模型,具有布尔 published 属性,以及一个模型工厂来为我们的表做种,如下所示:
$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[];
}
// ...
}
当播种 posts 表时,scout 不会通过返回空数组来忽略 unpublished 记录,而是会不断向模型工厂询问 published > 模型。
例如,如果两个种子记录随机未发布,则 scout 无论如何都会索引所有 10 条记录(而不是 8 条),将 未发布 的记录替换为新的模型工厂(带有 published 设置属性)。因此导致在 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();
}
【讨论】:
看看这个问题。这个问题已经在新版Scout中解决了 Adding Index to Laravel Scout Conditionally (Algolia)
【讨论】: