У меня есть класс уведомлений о статусе, поэтому при создании статуса он отправляет мне сообщение о резерве. Проблема, с которой я сталкиваюсь, заключается в том, что новый статус создается каждые несколько минут, а получение сообщения о резерве каждые пару минут является повторяющимся и неконструктивным. Тем более, что таких статусов публикуют десятки серверов.
Будет ли способ отправить сообщение о резерве только в том случае, если изменился статус конкретного сервера? например сервер был запущен, затем отключился.
Я пробовал получить все статусы сервера, но не могу понять, как получить только последние два с определенным идентификатором сервера.
-------------------------------------------------- ------- РЕДАКТИРОВАНИЕ ------------------------------------------ ------------------ Попытка, сделанная ранее: кроме последней, я бы там не хотел
$statuses = ServerStatus::all();
$first = ServerStatus::where('server_id', $notifiable->server_id)->first();
//dump($first);
foreach($statuses as $status){
if ($status->server_id === $notifiable->server_id){
//dump($status);
if ($status->status_id !== $first->status_id){
return (new SlackMessage)
->content('One of your statuses has been updated!');
}
else{
return (new SlackMessage)
->content('One of your statuses has been not updated!');
}
}
}
также моя загрузка для отправки уведомления каждый раз, когда создается ServerStatus:
защищенная статическая функция boot () {
parent::boot();
ServerStatus::created(function($model) {
$original = ServerStatus::where('server_id', $model->server_id)->skip(1)->first();
dump('original',$original->status_id);
dump('serverStatus', $model->status_id);
if ($original && $model->status_id != $original->status_id) {
$model->notify(new ServerStatusNotification());
}
});
}
Я не уверен, как здесь помогает миграция. Вы не показали, как инициируется уведомление. Почему бы вам просто не запросить в классе уведомлений, соответствует ли последний статус, если это так, не отправляйте уведомление.
Могу ли я использовать pluck для получения предыдущего статуса, потому что, когда я запускал dd (ServerStatus :: pluck ('server_id', 'status_id')), он возвращал только самое последнее состояние каждого сервера. Это затем перезаписывается новым состоянием и практически бесполезно для меня? верный? (Довольно новичок в laravel в целом, извините, если это звучит тривиально)
Это должен быть довольно простой запрос. Если вы пытаетесь использовать выщипывание без каких-либо условий, я думаю, вам есть чем заняться. Предлагаю вам прочитать Laravel.com/docs. Это очень хорошо задокументировано.






Я бы привязал к событию updating в функции загрузки вашей модели ServerStatus, чтобы вы могли сравнить isDirty. Вы можете вызвать в isDirty('status_id'), чтобы определить, был ли изменен идентификатор статуса, примерно так:
protected static function boot()
{
parent::boot();
ServerStatus::created(function(ServerStatus $serverStatus) {
$original = ServerStatus::where('server_id', $serverStatus->server_id)->last();
if ($original && $serverStatus->status_id !== $original->status_id) {
// send slack notification, status id differs
}
});
}
Если вам нужен больший контроль над определенным статусом, вы можете вызвать getOriginal(), чтобы получить исходное значение и определить, например, в вашем случае, конкретные переходы состояний:
ServerStatus::created(function(ServerStatus $serverStatus) {
$original = ServerStatus::where('server_id', $serverStatus->server_id)->last();
if ($original && $original->status->description === 'up' && $serverStatus->status->description === 'down') {
//send server went down notification
} else if ($original && $original->status->description === 'down' && $serverStatus->status->description === 'up') {
//send server is up notification
}
});
На самом деле я не знаю, каково ваше имя отношения, или столбец, в котором хранится текстовая версия status, но что-то вроде приведенного выше должно сработать для вас.
Большое вам спасибо, я пытался реализовать большую часть своей логики в самом классе уведомлений, так что это мне очень помогло! После реализации первого, я вообще не получаю никаких сообщений о бездействии, я постараюсь снять некоторые и дам вам знать.
Будет ли это работать, даже если они создают новую модель каждый раз при обновлении статуса? Не просто обновление записи в базе данных?
@Striker Значит, новая модель ServerStatus создается каждый раз при обновлении статуса? В таком случае это вообще не сработает, потому что оригинала не было, и isDirty каждый раз выходил из строя. Вам нужно будет получить предыдущий ServerStatus в функции creating вместо «обновления».
Да, каждый раз создается новый ServerStatus. Я прикрепил то, что пробовал ранее, вероятно, это не так, но я подумал, что это может помочь.
@Striker Обновлено, это может быть вам более полезно
Я даю этому шанс, вы уверены, что он последний (), не будет ли он первым (). Я изменил его на first and die и сбросил обе переменные, заметив, что он отправляет сообщение каждый раз, когда я все еще создавал. Что было странно, так это $serverStatus->status_id и $original->status_id, оба были 2, просто статус сервера был строкой, а исходным - int.
добавил фото dd и то, что у меня сейчас есть для загрузки
получил это работает! завершенная версия добавлена выше!
Конечно - получите предыдущий статус и сравните его.