Laravel Eloquent save 触发了哪些事件

 我来答
就烦条0o
2016-07-16 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46492
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
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
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式