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中文网其他相关文章!