Laravel Eloquent save 触发了哪些事件
1个回答
展开全部
Illuminate/Database/Eloquent/Model.php
public function save(array $options = [])
{
$query = $this->newQueryWithoutScopes();
if ($this->fireModelEvent('saving') === false) {
return false;
}
if ($this->exists) {
$saved = $this->performUpdate($query, $options);
} else {
$saved = $this->performInsert($query, $options);
}
if ($saved) {
$this->finishSave($options);
}
return $saved;
}
首先触发的当然是saving,如果saving返回的是false,巧正那么save就失败了,返回false
接着如果$this->exists,就是这个model不是老宽旁新创建的,那么就需要进行更新操作
protected function performUpdate(Builder $query, array $options = [])
{
$dirty = $this->getDirty();
if (count($dirty) > 0) {
if ($this->fireModelEvent('updating') === false) {
return false;
}
if ($this->timestamps && Arr::get($options, 'timestamps', true)) {
$this->updateTimestamps();
}
$dirty = $this->getDirty();
if (count($dirty) > 0) {
$numRows = $this->setKeysForSaveQuery($query)->update($dirty);
$this->fireModelEvent('updated', false);
}
}
return true;
}
看看更新干了什么,
首先如果这个模型dirty了,也就是脏了,也就是有属性改变了,那么才需要更新
先触发updating,更新失败了就false,
更新时间戳
这里又判断了count($dirty) > 0,为什么??更updateTimestamps有什么关系吗?没有仔细看,以后再说吧
然后执行update,也就是写入侍橡了数据库
最后触发updated
那么如果这个对象是新建的,也就是需要执行插入操作,performInsert也做了差不多的事,
触发creating,
执行insert,插入数据库,
最后created。
最后回到save方法,如果更新或者插入操作成功了,那么就finishSave来结束save,
finishSave 触发了saved事件, 最后syncOriginal。
小结一下
新创建的对象,save依次触发 saving->creating->created->saved
已存在的对象,save依次触发 saving->updating->updated->saved
public function save(array $options = [])
{
$query = $this->newQueryWithoutScopes();
if ($this->fireModelEvent('saving') === false) {
return false;
}
if ($this->exists) {
$saved = $this->performUpdate($query, $options);
} else {
$saved = $this->performInsert($query, $options);
}
if ($saved) {
$this->finishSave($options);
}
return $saved;
}
首先触发的当然是saving,如果saving返回的是false,巧正那么save就失败了,返回false
接着如果$this->exists,就是这个model不是老宽旁新创建的,那么就需要进行更新操作
protected function performUpdate(Builder $query, array $options = [])
{
$dirty = $this->getDirty();
if (count($dirty) > 0) {
if ($this->fireModelEvent('updating') === false) {
return false;
}
if ($this->timestamps && Arr::get($options, 'timestamps', true)) {
$this->updateTimestamps();
}
$dirty = $this->getDirty();
if (count($dirty) > 0) {
$numRows = $this->setKeysForSaveQuery($query)->update($dirty);
$this->fireModelEvent('updated', false);
}
}
return true;
}
看看更新干了什么,
首先如果这个模型dirty了,也就是脏了,也就是有属性改变了,那么才需要更新
先触发updating,更新失败了就false,
更新时间戳
这里又判断了count($dirty) > 0,为什么??更updateTimestamps有什么关系吗?没有仔细看,以后再说吧
然后执行update,也就是写入侍橡了数据库
最后触发updated
那么如果这个对象是新建的,也就是需要执行插入操作,performInsert也做了差不多的事,
触发creating,
执行insert,插入数据库,
最后created。
最后回到save方法,如果更新或者插入操作成功了,那么就finishSave来结束save,
finishSave 触发了saved事件, 最后syncOriginal。
小结一下
新创建的对象,save依次触发 saving->creating->created->saved
已存在的对象,save依次触发 saving->updating->updated->saved
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询