Laravel Eloquent 的模型修剪功能可讓您自動刪除資料庫中過時或不需要的記錄。這有助於提升大型資料庫的效能,並防止不必要的資料累積。在 Laravel 中,您可以透過排程任務或 Artisan 指令來執行修剪操作。
當需要在特定時間後刪除舊記錄時,可以使用此方法。例如,如果您希望在帖子創建 30 天後自動刪除該帖子,則可以使用修剪功能。
prune()
方法:Laravel Eloquent 8.x 版本引進了 prune()
方法。此方法專門用於根據特定條件刪除記錄。
<code class="language-php">use App\Models\Post; class Post extends Model { protected static function booted() { static::pruning(function ($query) { // 删除 30 天前创建的帖子 $query->where('created_at', '<', now()->subDays(30)); }); } }</code>
每次執行 Post::prune()
時,它都會刪除 30 天前的貼文。
您可以使用 Laravel 的任務排程功能,在特定時間內定期刪除舊資料。
schedule()
方法中加入您的修剪任務。 <code class="language-php">use App\Models\Post; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel { protected function schedule(Schedule $schedule) { // 每天凌晨 1 点修剪旧帖子 $schedule->call(function () { Post::where('created_at', '<', now()->subDays(30))->delete(); })->dailyAt('01:00'); } }</code>
這將每天凌晨 1 點刪除 30 天前的貼文。
您也可以使用 Artisan 指令手動執行修剪操作。透過建立新的 Laravel Artisan 指令來刪除資料。
<code class="language-bash">php artisan make:command PruneOldPosts</code>
<code class="language-php">namespace App\Console\Commands; use Illuminate\Console\Command; use App\Models\Post; class PruneOldPosts extends Command { protected $signature = 'posts:prune-old'; protected $description = 'Prune posts older than 30 days'; public function handle() { // 删除 30 天前创建的帖子 Post::where('created_at', '<', now()->subDays(30))->delete(); $this->info('Old posts pruned successfully!'); } }</code>
<code class="language-bash">php artisan posts:prune-old</code>
這將手動運行並刪除 30 天前的帖子。
有時您可能希望使用軟刪除,即不完全刪除記錄,而只是將其標記為「已刪除」。在這種情況下,您可以結合軟刪除和修剪功能。
<code class="language-php">use App\Models\Post; class Post extends Model { use SoftDeletes; protected static function booted() { static::pruning(function ($query) { // 修剪 30 天前软删除的帖子 $query->where('deleted_at', '<', now()->subDays(30)); }); } }</code>
這將刪除 30 天前軟刪除的貼文。
當您想要刪除與記錄相關的記錄時,您需要同時刪除這些關係。例如,如果您希望在刪除貼文時也刪除其相關的評論,則可以使用級聯刪除。
<code class="language-php">class Post extends Model { use SoftDeletes; public function comments() { return $this->hasMany(Comment::class); } protected static function booted() { static::deleting(function ($post) { // 删除帖子时删除所有评论 $post->comments()->delete(); }); } }</code>
這將確保刪除貼文時也會刪除其相關的評論。
以上是Bangla 部分剪枝模型中的 Laravel Eloquent ORM)的詳細內容。更多資訊請關注PHP中文網其他相關文章!