2016-11-16 6 views
1

Я использую laravel scout для загрузки записей для поиска в algolia. Я добавил свойство, пригодное для поиска, к моей модели, и все работает нормально.исключить определенные записи из laravel scout/algolia

Существует случай, когда я не хочу добавлять определенные записи в свой индекс, если они установили статус I.E НЕПРАВИЛЬНО.

есть ли я могу оценить поле статуса и решить, хочу ли я, чтобы модель была загружена в индекс?

ответ

0

Просто используйте $model_name->unsearchable(), чтобы удалить его из индекса Алголии.

См «Удаление записей» в документации для получения более подробной информации: https://laravel.com/docs/5.3/scout#removing-records

+0

Я знаю, что могу сделать это на сбережении модели, я надеялся встроить функцию в саму модель, чтобы держать вещи аккуратнее. – 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(); 
}