未触发模型事件

时间:2014-06-24 17:29:45

标签: events laravel model laravel-4

我无法解决模型事件。

目前我有以下

use Illuminate\Database\Eloquent\SoftDeletingTrait;

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)或创建一个无效的文件。所以我假设事件没有被触发。对此事有何强硬态度?

4 个答案:

答案 0 :(得分:0)

我知道这不是一个完美的答案,但是我通过使用它解决了类似的问题:

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

答案 1 :(得分:0)

我在使用介入\图像包时再次遇到了这个问题。我将其添加到名称为ImageEditor而不是Image的别名数组中。然后我创建了一个使用ImageEditor的类Image。在干预\图像包的次要更新中,我的事件停止了触发。我尝试编写类的完整路径,使用static::而不是Image::,但没有一个工作。

现在我将别名更改回Image并将我的Image类重命名为其他内容,事件再次开始触发。

答案 2 :(得分:0)

我有类似的问题。我用过:

model0hasmanyrelation()->delete()

当记录被删除(软)时,模型的事件没有触发。解决方案是使用:

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

答案 3 :(得分:0)

你应该改变这个:

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() Eloquent的情况下调用first()只需通过Builder执行直接SQL查询。