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模型观察者的使用请看文档