从laravel scout / algolia中排除某些记录

时间:2016-11-16 11:39:33

标签: laravel algolia

我正在使用laravel scout上传记录以便在algolia中搜索。我已将可搜索的特征添加到我的模型中,一切正常。

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

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

4 个答案:

答案 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)