Laravel Eloquent 的關係模型聯動

JokerLinly發表於2017-05-14

file

本文翻譯改變自 Povilas KoropEloquent Touch for Models and their Relationships (文章圖片來源)

關於這個話題我想在這裡寫兩個使用技巧。可能你會知道其中一個,但不知道另一個。也可能,你兩個都不知道~

OK,進入正題之前,如果你不知道Eloquent 的表有 created_atupdated_at 這兩個欄位,那麼恭喜你,現在你知道了。

一般來說,在你進行任何資料更新的時候 Eloquent 會自動幫你維護這兩個欄位,而現在我們要說的是,即便那一行資料裡面沒有任何更新,也可以更新 updated_at 這個欄位。

請看程式碼:

$user = User::find(1);
$user->touch();

touch() 方法可以不需要更新其他欄位就用當前時間戳對 updated_at 進行更新。這個方法用來儲存 最後一次處理時間 亦或者是 使用者最近一次活躍時間 是極好的。

除此之外還有 第二招。通過在 Eloquent 模型中的 touches 屬性中新增模型關係的名稱,也可以做到這件事情。而且我更喜歡這個辦法:

class Comment extends Model {

    protected $touches = ['post'];

    public function post()
    {
        return $this->belongsTo('Post');
    }

}

$touches 陣列中新增與這個模型關聯的關係之後,只要這個模型被更新,就會立即更新陣列中新增的關聯模型的 updated_at 欄位。而你只需要同往常一般操作模型即可:

$comment = Comment::find(1);
$comment->text = 'Edit to this comment!';
$comment->save();

這樣一來,與這個 Comment 相關的 Post 就會獲得一個新的 updated_at 值。這玩意真的真的非常有用,假設一個實體有很多關聯關係,你可以不需要一個個去檢查也能夠對他們的 update_at 進行更新。

最後,我想鼓勵你有空的時候嘗試去閱讀一下 Laravel 的原始碼,裡面有很多隱藏的大招沒有被記錄在官方文件中,甚至也可能並不為多數人所知。例如你可以通過 GitHub 的這份檔案在 Eloquent 中找到第一招裡面的 touch() 以及其他沒有出現在文件中的屬性。最起碼我認識的很多大牛都至少讀了一遍 Laravel 的原始碼~

想第一時間檢視第一手 Laravel 資訊?聽說聰明的人都用上這個 外掛 了呢!

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

Stay Hungry, Stay Foolish.

相關文章