【问题标题】:exclude certain records from laravel scout/algolia从 laravel scout/algolia 中排除某些记录
【发布时间】:2016-11-16 11:39:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: laravel algolia


    【解决方案1】:

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

    它会成功的。

    【讨论】:

    • 如果我这样做,它仍然会调用 agolia,但它是空白的。有没有办法阻止它发出声音?
    【解决方案2】:

    只需使用 $model_name->unsearchable() 将其从您的 Algolia 索引中删除。

    有关详细信息,请参阅文档中的“删除记录”:https://laravel.com/docs/5.3/scout#removing-records

    【讨论】:

    • 我知道我可以在模型保存上做到这一点,我希望将功能嵌入模型本身以保持整洁。
    【解决方案3】:

    假设我们有一个 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();
    }
    

    【讨论】:

      【解决方案4】:

      看看这个问题。这个问题已经在新版Scout中解决了 Adding Index to Laravel Scout Conditionally (Algolia)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-11
        • 1970-01-01
        • 2019-02-18
        • 2022-01-14
        • 2014-05-15
        • 2015-12-10
        • 1970-01-01
        • 2017-09-03
        相关资源
        最近更新 更多