iT邦幫忙

2022 iThome 鐵人賽

DAY 12
1
Modern Web

Laravel 9 漫遊,享受魔法般的極速網頁開發體驗系列 第 12

Day 12:搭配 Soft Delete 的好夥伴:Pruning Models

  • 分享至 

  • xImage
  •  

會員的登入註冊處理好之後,接著我們來處理文章在資料庫裡面的各種操作。

基本上,Laravel 針對資料庫的操作方式,沒什麼太大的改變,想學的朋友可以參考之前的文章

值得注意的一個小地方,是我們現在 make:model 的時候

./vendor/bin/sail artisan make:model Post

Model 不再是放在 app/ 底下,而是 app/Models 底下了!算是一個小調整

<?php  
  
namespace App\Models;  
  
use Illuminate\Database\Eloquent\Factories\HasFactory;  
use Illuminate\Database\Eloquent\Model;  
  
class Post extends Model  
{  
    use HasFactory;  
}

針對 Soft Delete 的部分,除了之前的文章 [Day 20] 刪除文章但是不刪除資料!聊 Soft Delete 提到的內容,Laravel 還加入了一個新功能:Pruning!

簡單的說,在過去,要清理掉被 Soft Delete 的文章,需要自己手動寫判斷邏輯,比方說被刪除超過一個月的資料,或者被建立超過一個月的資料,並自己撰寫排程定期清理。

現在的話,可以透過 Laravel 8 開始提供的 Illuminate\Database\Eloquent\Prunable 這個 trait,來幫助我們處理這段邏輯!

我們來看看怎樣使用

<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
 
class Post extends Model
{
    use Prunable;
 
    /**
     * Get the prunable model query.
     *
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function prunable()
    {
        return static::where('created_at', '<=', now()->subMonth());
    }
}

只要這樣,我們就可以標記 Post 只要建立時間超過一個月,就是屬於「可被清掉的」。

然後,我們再利用 App\Console\Kernel 裡面的 schedule()

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')->hourly();
        $schedule->command('model:prune')->daily();
    }

就可以每天清理掉多餘的資料了!

如果希望資料被清理時,要同時做一些附加的動作,比方說清理掉對應的文章圖片,可以定義在 Model 的 pruning() 事件裡面

/**
 * Prepare the model for pruning.
 *
 * @return void
 */
protected function pruning()
{
}

今天有關資料清理的部分,就分享到這邊,我們明天見!


上一篇
Day 11:網站會員登入:談 Laravel Breeze
下一篇
Day 13:用 Factory 協助資料庫的自動化測試
系列文
Laravel 9 漫遊,享受魔法般的極速網頁開發體驗30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
小克
iT邦新手 4 級 ‧ 2022-10-04 15:16:04

這個功能好棒!感謝分享
Laravel >= 8.50.0 都可以使用

我要留言

立即登入留言