Laravel:ORM模型为自己的方法建立Observer

来源:互联网 发布:sql执行视图命令 编辑:程序博客网 时间:2024/06/05 22:43

Laravel:ORM模型为自己的方法建立Observer

背景

在ORM模型中,虽然提供了很多的数据库操作方法,如save,delete等,当时如果想要一次插入多条数据时,通常使用insert方法。此时,如果我们要使用观察者方法对insert进行观察时,会发现没有任何作用。这是因为,ORM模型中并没有自己实现这个方法,而是通过__call这个方法调用一个newQuery()方法,然后调用insert。这样的话,使用观察者就无法观察到insert这个方法。

解决方法

解决问题的思路是:在调用insert方法时,自己在模型中实现一个insert方法来模拟__call的动作,然后手动触发一个insert事件,在hasEvents类中,将这个事件添加后,就可以使用观察者观察到了。
具体如下:

1 在模型中添加一个insert方法:

    public function insert(array $options = [])    {        $query = $this->newQueryWithoutScopes();        if($result = $query->insert($options)) {            $this->fireModelEvent('insert', false);        }    }

这个方法是调用其它的方法实现了项数据库中的插入数据的方法,这个方法可以在追踪__call时找到的。然后插入成功后,发出一个事件,事件名为’insert’。此时,由于hasEvent中,并没有这个事件,所以无法观察到。

2 在hasEvent中添加事件

    public function getObservableEvents()    {        return array_merge(            [                'creating', 'created', 'updating', 'updated',                'deleting', 'deleted', 'saving', 'saved',                'restoring', 'restored', 'insert',            ],            $this->observables        );    }

到这一步,就可以使用观察者观察到insert事件了。

3 在观察者中添加观察方法

    public function insert(Student $student)    {        dd('insert.....');    }

此时就可以实现,当使用模型insert向数据库插入数据时,就可以观察到这个数据库操作了。
具体的ORM模型观察者的使用请看文档

原创粉丝点击