2016-11-16 42 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(); 
}