Событие модели не запущено

#events #laravel #model #laravel-4

#Мероприятия #laravel #Модель #laravel-4

Вопрос:

У меня возникли проблемы с запуском событий модели.

в настоящее время у меня есть следующее

 use IlluminateDatabaseEloquentSoftDeletingTrait;

class ProjectTwitterStatus extends Eloquent {

    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];

    protected $table = 'project_twitter_statuses';

    protected $guarded = array('id');

    public function twitterStatus() {
        return $this->belongsTo('TwitterStatus');
    }

    public function twitterStatusHashtag() {
        return $this->hasMany('TwitterStatusHashtag','twitter_status_id','twitter_status_id');
    }

    public function project() {
        return $this->belongsTo('Project');
    }

    public static function boot()
    {
        parent::boot();

        static::deleting(function($model)
        {
            echo 'deleting status';
        });
    }
}
 

И удаление инициируется во вспомогательном классе:

 public static function deleteStatus($input_ids, $project) {

    // Make sure ids are in an array
    $twitterStatusIds = (!is_array($input_ids) ? array($input_ids) : $input_ids);

    foreach($twitterStatusIds as $twitterStatusId) 
    {
        ProjectTwitterStatus::where('twitter_status_id', '=', $twitterStatusId)
            ->where('project_id','=',$project->id)
            ->delete();
    }
    // Forget the cache variable
    Cache::forget('twitter-dashboard-statistics-'.$project->id);

    return true;
}
 

удаление работает нормально, но каким-то образом события модели не запускаются. Эхо-сигнал «статус удаления» является заполнителем для отображения инициируемого события, я попробовал несколько заполнителей, dd ($model) или создание файла, ни один из которых не сработал. Поэтому я предполагаю, что событие не является триггерным. Какие-либо замечания по этому вопросу?

Комментарии:

1. Просто догадка, попробуйте удалить SoftDeletingTrait и попробовать. Мне интересно, если это мягкое удаление, события удаления не вызываются. Может быть ошибка.

2. Я удалил SoftDeletingTrait , но это не имело никакого эффекта : (

Ответ №1:

Я знаю, что это не идеальный ответ, однако я исправил аналогичную проблему, используя это:

 Event::listen('eloquent.creating: ProjectTwitterStatus', function($model)
 

Комментарии:

1. Я только что попробовал это, используя eloquent.deleting , но это не сработало:(.

2. Удалена ли модель из базы данных?

3. Да, оно программно удалено из базы данных. не запускается только событие.

4. Можете ли вы попробовать return false в закрытии события? Оно все еще удалено?

Ответ №2:

Я снова столкнулся с этой проблемой, когда использовал пакет intervention image. Я добавил его в массив псевдонимов с именем ImageEditor вместо Image . Затем я создал класс Image , который использует ImageEditor. При незначительном обновлении пакета intervention image мои события перестали запускаться. Я попытался написать полный путь к классу, использовать static:: вместо Image:: , но ни один из них не сработал.

Теперь я изменил псевдоним обратно на Image и переименовал свой Image класс во что-то другое, события снова начали запускаться.

Ответ №3:

У меня была / есть похожая проблема. Я использовал:

 model0hasmanyrelation()->delete()
 

и хотя записи были (мягко) удалены, событие модели не сработало. Решение состояло в том, чтобы использовать:

 model0hasmanyrelation->each(function($model0){$model0->delete()});
 

Ответ №4:

Вы должны изменить это:

 foreach($twitterStatusIds as $twitterStatusId) 
  {
      ProjectTwitterStatus::where('twitter_status_id', '=', $twitterStatusId)
          ->where('project_id','=',$project->id)
          ->delete();
  }
 

к этому:

 foreach($twitterStatusIds as $twitterStatusId) 
  {
      ProjectTwitterStatus::where('twitter_status_id', '=', $twitterStatusId)
          ->where('project_id','=',$project->id)
          ->first()
          ->delete();
  }
 

Таким образом, объект модели фактически загружается, и события имеют шанс сработать. При вызове delete() без first() Eloquent просто выполняется прямой SQL-запрос через Builder.