laravel refresh eloquent model

Laravel Note – Refresh Eloquent Model

Hi các bạn.

Mình mới gặp problem này nên muốn chia sẻ cũng như note lại lun, cũng khá là oke với quan trọng trong quá trình xử lý business logic :))

Vấn đề mình muốn nói tới là Laravel – Eloquent nhé.

Trước khi đọc bài này, tôi nghĩ bạn đã có kiến thức về:

  • Laravel 5+
  • Eloquent
    • Basic Accessor
    • Basic Relationship

1/ Problem about Eloquent

Cụ thể, sau khi mình create/insert một record mới thông qua Eloquent model, mọi thứ đều ok.

Problem xảy ra khi mình pass cái Instance mình mới tạo ra ($itemModel maybe) vào 1 hàm để tiếp tục chạy và xử lý abc xyz khác.

Tuy nhiên tiếp tục Process Business thì nó lại thất bại (mình có check data trong business, empty/null là stop hết). Và đa số mình lại check vào cái Accessor của Eloquent hay trỏ vào Relationship.

Nhưng trong khi mình Re-Process lại thì nó lại chạy 100% thành công. LOL.

Và sau một hồi nhận định, mình nghĩ ngay là 100% Eloquent này nó chưa update lại Accessor cũng như Relationship Data cho mình. Hehe.

2/ Solve the Problem – Refresh Eloquent Model

Vâng, vậy nên mình đã tìm để có thể load lại cái model để mình tiếp tục xử lý Business riêng của App ngay sau đó.

Eloquent đã có sẵn method có tên là “refresh”:

$itemModel->refresh();

Chỉ với đoạn code đơn giản trên, nó đã load lại toàn bộ cái Instance Model của mình. Và Process after Created của mình chạy hoàn hảo ko bị gì nữa.

3/ Dive Deep Into Refrehs Eloquent Model

Với các bạn nào mà sử dụng PHPStorm, mạnh tay “Go to declaration” liền. Và ta sẽ thấy đoạn code như sau ( Mình đang xài Lumen Framework 5.8 ):

/**
     * Reload the current model instance with fresh attributes from the database.
     *
     * @return $this
     */
    public function refresh()
    {
        if (! $this->exists) {
            return $this;
        }

        $this->setRawAttributes(
            static::newQueryWithoutScopes()->findOrFail($this->getKey())->attributes
        );

        $this->load(collect($this->relations)->except('pivot')->keys()->toArray());

        $this->syncOriginal();

        return $this;
    }

Aha, cũng như cái note mà Creator đã ghi. Nó sẽ đơn giản load row data lại từ cái “primary key” của mình trong DB và update lại hết kèm với load luôn relationships.

Đúng như những gì chúng ta cần.

4/ So sánh với Model::find thay vì Refresh Eloquent Model

  • Model::find($id)
    • Tạo ra một object mới và load toàn bộ row data từ ID mà ta bỏ vào. (Ví dụ sau khi create ta có ID, lại pass lại vào để load lại full data). Full load như bình thường (accessor, relationships)
    • Bad practice cho trường hợp của mình vì mình fải tạo thêm 1 object instance nữa. (Tốn bộ nhớ dù mình có đầy =)) )
  • Refresh Eloquent Model – Model::refresh():
    • Từ object instance đã có hiện tại, method refresh sẽ lấy ra ID hiện tại và load lại toàn bộ row data cũng như relationships.
    • Best practice cho trường hợp của mình, vì mình chỉ refresh lại và tiếp tục reuse object instance hiện tại. (Tuy rằng bộ nhớ ko quan trọng lắm vì mình có đầy =)) )

Đây là theo hướng nhận định của mình về trường hợp của mình. Có thể trường hợp của các bạn giống or khác. Tùy vào case mà ta có cách solve khác nhau.

5/ Finalization about Refresh Eloquent Model

Đây là một practice nho nhỏ trong Laravel – cụ thể là Eloquent mà chúng ta nên note lại và sau này sử dụng. Vì mình nghĩ, chúng ta có thể gặp khá nhiều. Sẽ luôn  luôn có những cases mà sau khi created/updated, ta sẽ tiếp tục sử dụng. Muốn xử lý data thật chính xác, ta fải để ý mà refresh lại sau mỗi lần created/updated. Nhất là khi bạn dealing với Business Data, must be always right.

Cám ơn các bạn đã quan tâm theo dõi! 😝

facebook
Seth Phát

Seth Phát

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

Leave a Reply

Your email address will not be published. Required fields are marked *

Bình luận qua Facebook