#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.