<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                我們來看看laravel Eloquent save的時候到底觸發了哪些事件 ~~~ 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 好了知道了我們知道了model save的時候觸發了哪些事件,但是還是沒有解決我們的問題啊,到底是因為狀態改變了觸發的還是因為訂單其他的值改變了觸發的呢?訂單原來的狀態怎么獲取呢? 這就需要看看isDirty和syncOriginal是怎么回事了 打印過Eloquent 對象的應該都會發現,其實模型會有兩個數組,一個original,一個attributes。 這下應該就明白了,初始化一個模型的時候這兩個數組是一樣的,賦值操作只是改變attributes,所以isDirty也就是根據兩個數據來判斷模型是否dirty了,模型觸發完saved事件后才會執行syncOriginal,syncOriginal也就是將attributes賦值給original。所以上面觸發的所有事件,我們都是能拿到原來的值和變化的值得。 所以我們的問題也就解決了,當模型觸發updated事件的時候,我們根據isDirty(['status']) 知道訂單狀態改變了,然后拿到訂單之前是個什么樣子,改變后是個什么樣子,該發什么消息也就很明朗了。 update方法,其實就是fill()->save() ~~~ $user = App\Models\User::find(1) >>> $user->isDirty(); => false >>> $user->name = '123'; => "123" >>> $user->isDirty(); => true ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看