你可能不知道的 Laravel Eloquent 操作

Remember發表於2020-01-06

你可能不知道的 Laravel Eloquent 騷操作

從它的眼睛,我什麼都沒看到

Laravel Eloquent 提供了太多現成的方法,但是官方文件上有些東西是看不到的,這就需要日常開發的積累,原始碼的檢視,以及相互之間的分享。

我接觸 Laravel 時間很短,也就幾個月的時間。所以一般我知道的你們肯定也知道,今天主要分享一下我知道的可能你不知道的而且文件沒有的 Eloquent 中的幾個操作。

大概率會碰到的。假設現在使用者模型 User 和 微信 Wechat 是一對一關係,然後進行以下操作:

$user = User::where('name', 'wuqinqiang')->first();
$user->age = 18;
$user->wechat->nickName = "Remember";
$user->save()

那麼此時,會儲存使用者資訊,但是並不會儲存對應 Wechat 的關聯資訊,想讓它一起儲存咋麼辦?也很簡單。把 save 換成 push 即可。

$user->push();

我們都知道,在使用 Eloquent 模型的時候,建立或者更新模型這些操作的時候,是有幾個階段的事件的,有時候可能因為業務上的需要,可能會監聽某個事件執行某些操作。比如下面這段監聽對應事件執行對應操作的程式碼:

    public static function boot()
    {
        parent::boot();
        static::creating(function ($model) {
           //業務邏輯
        });
    }

那要是不想在操作時觸發任何事件則麼辦?你可以執行一個回撥函式而無需觸發任何事件:

$user = User::withoutEvents(function () {
return //儲存或者更新程式碼
});

想知道從資料庫查詢獲取出來的模型是否被動過手腳(修改)?也有辦法。可以使用 isDirty

$ user = User :: where('name','wuqinqiang')->first();
$ user-> isDirty(); // 還沒被動過 返回 false
$ user-> name ='curry';  
$ user-> isDirty(); //模型被動過了 返回true 
$ user-> isDirty('email'); // 可以傳入引數  驗證某個引數是否被動過,這個我還沒碰過 當然 false
$ user-> isDirty('name'); // true 

如果你還想具體瞭解到哪些是被動過了,可以使用:

$user->getDirty();  你將得到一個陣列 ["name" => "curry"]

既然上面提到是否被動過手腳,那動過手腳之後我又想看看之前的模樣(ps:人就是這樣麻煩)。強大的 Laravel Eloquent 也可以辦到:

$ user = User :: where('name','wuqinqiang')->first();
$user->name = 'curry';
$user->getOriginal(); // 返回陣列 "name" => "wuqinqiang"
$user->getOriginal('name'); //指定要看哪個屬性的原值  "wuqinqiang"

順便分享一下你們知道的我不知道的文件上沒有的騷操作??

本作品採用《CC 協議》,轉載必須註明作者和本文連結

吳親庫裡

相關文章