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