Лучший способ предотвратить одновременные мутации модели в Laravel

Попробуйте

const dataArray = await db.collection("mycoll")
  .find({ status: "init" })
  .project({ _id: 1 })
  .sort(sort)
  .limit(limit)

const pending_array_whitelist = dataArray.map((data) => {
  return (data._id)
})

const update = await db.collection("mycoll").update(
  { _id: { $in: pending_array_whitelist } },
  { $set: { status: "pending" } },
  { multi: true }
)

console.log(update)
0
задан David Heremans 18 January 2019 в 20:28
поделиться

1 ответ

Итак, вы хотите написать характеристику, которая будет выполнять проверку, чтобы увидеть, была ли модель обновлена ​​с момента получения текущей, и отбросить что-то, что вы можете зацепить, чтобы уведомить пользователя? Я хотел бы изучить создание базовой модели, которую расширяют все ваши модели, и использование событий модели в этой базовой модели. Возможно, вам даже не понадобится черта, если у вас есть все модели, расширяющие базовую модель. См. Ниже пример метода события модели:

protected static function boot(){
    parent::boot();
    static::saving(function($thisModel){
        $changes = Model::where('version', $thisModel->version)
            ->where('id', $thisModel->id)->first()
        /** if changes->version matches this one, good, if not, set some
         *  property on the model that can be checked.   
         */
    }
}

Это произойдет , когда модель будет сохранена, и если вы return false; окажетесь в любой точке метода, сохранение завершится неудачно, и модель не будет сохранена.

Если вы все еще хотите использовать черту, убедитесь, что метод загрузки соответствует следующему формату: bootTraitName (), иначе он не загрузится при загрузке реализующих классов. Это сложный вопрос с множеством разных точек зрения, но я надеюсь, что по крайней мере дал вам кое-что рассмотреть.

Редактировать: я никогда не использовал модельные события в базовой модели, поэтому я не уверен, что parent::boot(); необходимо. Возможно, придется проверить.

0
ответ дан N Mahurin 18 January 2019 в 20:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: