首页 >数据库 >mysql教程 >Bangla 部分剪枝模型中的 Laravel Eloquent ORM)

Bangla 部分剪枝模型中的 Laravel Eloquent ORM)

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-16 20:18:11949浏览

Laravel Eloquent ORM in Bangla Part-Pruning Models)

Laravel Eloquent 的模型修剪功能允许您自动删除数据库中过时或不需要的记录。这有助于提升大型数据库的性能,并防止不必要的数据累积。在 Laravel 中,您可以通过计划任务或 Artisan 命令来执行修剪操作。

主要方法:

1. 旧模型修剪 (删除旧记录)

当需要在特定时间后删除旧记录时,可以使用此方法。例如,如果您希望在帖子创建 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 天前的帖子。

2. 使用计划任务进行修剪

您可以使用 Laravel 的任务调度功能,在特定时间定期删除旧数据。

创建计划任务:

  1. 打开 app/Console/Kernel.php 文件,并在 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 天前的帖子。

3. 使用 Artisan 命令进行修剪

您还可以使用 Artisan 命令手动执行修剪操作。通过创建新的 Laravel Artisan 命令来删除数据。

创建自定义 Artisan 命令:

  1. 创建命令:
<code class="language-bash">php artisan make:command PruneOldPosts</code>
  1. app/Console/Commands/PruneOldPosts.php 文件中创建自定义命令:
<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>
  1. 运行命令:
<code class="language-bash">php artisan posts:prune-old</code>

这将手动运行并删除 30 天前的帖子。

4. 软删除和修剪

有时您可能希望使用软删除,即不完全删除记录,而只是将其标记为“已删除”。在这种情况下,您可以结合软删除和修剪功能。

<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 天前软删除的帖子。

5. 修剪和 Eloquent 关系

当您想要删除与记录相关的记录时,您需要同时删除这些关系。例如,如果您希望在删除帖子时也删除其相关的评论,则可以使用级联删除。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn