>  기사  >  PHP 프레임워크  >  Laravel의 소프트 삭제 원리는 무엇입니까?

Laravel의 소프트 삭제 원리는 무엇입니까?

WBOY
WBOY원래의
2022-02-22 18:18:302435검색

laravel에서 소프트 삭제란 데이터 테이블 레코드가 실제로 데이터베이스에서 삭제되는 것이 아니라, 테이블 레코드의 표현 상태를 소프트 삭제로 표시하여 쿼리 시 해당 테이블 레코드를 필터링할 수 있도록 하는 것을 의미합니다. "삭제"되었습니다.

Laravel의 소프트 삭제 원리는 무엇입니까?

이 기사의 운영 환경: Windows 10 시스템, Laravel 버전 6, Dell G3 컴퓨터.

laravel의 소프트 삭제 원리는 무엇인가요?

1. 모델 삭제

1.1 삭제를 사용하여 모델 삭제

모델 삭제는 매우 간단합니다. 그런 다음 delete메소드를 호출하세요. delete方法即可:

$post = Post::find(5);
if($post->delete()){
    echo '删除文章成功!';
}else{
    echo '删除文章失败!';
}

该方法返回truefalse

1.2 使用destroy删除模型

当然如果已知要删除的模型id的话,可以用更简单的方法destroy直接删除:

$deleted = Post::destroy(5);

你也可以一次传入多个模型id删除多个模型:

$deleted = Post::destroy([1,2,3,4,5]);

调用destroy方法返回被删除的记录数。

1.3 使用查询构建器删除模型

既然前面提到Eloquent模型本身就是查询构建器,也可以使用查询构建器风格删除模型,比如我们要删除所有浏览数为0的文章,可以使用如下方式:

$deleted = Models\Post::where('views', 0)->delete();

返回结果为被删除的文章数。

2、软删除及其相关实现

2.1 软删除实现

上述删除方法都会将数据表记录从数据库删除,此外Eloquent模型还支持软删除。

所谓软删除指的是数据表记录并未真的从数据库删除,而是将表记录的标识状态标记为软删除,这样在查询的时候就可以加以过滤,让对应表记录看上去是被”删除“了。Laravel中使用了一个日期字段作为标识状态,这个日期字段可以自定义,这里我们使用deleted_at,如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空。

要让Eloquent模型支持软删除,还要做一些设置。首先在模型类中要使用SoftDeletestrait,该trait为软删除提供一系列相关方法,具体可参考源码IlluminateDatabaseEloquentSoftDeletes,此外还要设置$date属性数组,将deleted_at置于其中:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    use SoftDeletes;

    //设置表名
    public $table = &#39;posts&#39;;

    //设置主键
    public $primaryKey = &#39;id&#39;;

    //设置日期时间格式
    public $dateFormat = &#39;U&#39;;

    protected $guarded = [&#39;id&#39;,&#39;views&#39;,&#39;user_id&#39;,&#39;updated_at&#39;,&#39;created_at&#39;];

    protected $dates = [&#39;delete_at&#39;];
}

然后对应的数据库posts中添加deleted_at列,我们使用迁移来实现,先执行Artisan命令:

php artisan make:migration alter_posts_deleted_at --table=posts

然后编辑生成的PHP文件如下:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AlterPostsDeletedAt extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table(&#39;posts&#39;, function (Blueprint $table) {
            $table->softDeletes();
        });
    }

    ...//其它方法
}

然后运行:

php artisan migrate

这样posts中就有了deleted_at列。接下来,我们在控制器中编写测试代码:

$post = Post::find(6);
$post->delete();
if($post->trashed()){
    echo '软删除成功!';
    dd($post);
}else{
    echo '软删除失败!';
}

在浏览器中访问http://laravel.app:8000/test,页面输出如下:

当我们再次通过下面这段代码获取所有文章:

$posts = Post::all();
dd($posts);

已经看不到id为6的文章的身影了。

2.2 查询结果包含软删除模型

那如果想要在查询结果中包含软删除的记录呢?可以使用SoftDeletes trait上的withTrashed方法:

$posts = Post::withTrashed()->get();
dd($posts);

执行之后页面显示如下:

id为6的文章又出现在了查询结果中。有时候我们只想要查看被软删除的模型,这也有招,通过SoftDeletes上的onlyTrashed方法即可:

$posts = Post::onlyTrashed()->get();
dd($posts);

执行后页面显示结果如下:

2.3 软删除恢复

有时候我们需要恢复被软删除的模型,可以使用SoftDeletes提供的restore方法:

恢复单个模型

$post = Post::find(6);
$post->restore();

恢复多个模型

Post::withTrashed()->where('id','>',1)->restore();

恢复所有模型

Post::withTrashed()->restore();

恢复关联查询模型

$post = Post::find(6);
$post->history()->restore();

2.4 强制删除

如果模型配置了软删除但我们确实要删除改模型对应数据库表记录,则可以使用SoftDeletes提供的forceDelete

$post = Post::find(6);
$post->forceDelete();
이 메소드는 true 또는 false를 반환합니다.

1.2 destroy를 사용하여 모델 삭제

물론 삭제할 모델 ID를 알고 있는 경우 더 간단한 destroy 방법을 사용하여 직접 삭제할 수 있습니다. rrreee할 수 있습니다. 또한 한 번에 여러 모델을 전달합니다. 모델 ID로 여러 모델 삭제:

rrreee🎜삭제된 레코드 수를 반환하려면 destroy 메서드를 호출하세요. 🎜🎜🎜1.3 쿼리 빌더를 사용하여 모델 삭제🎜🎜🎜 앞서 Eloquent 모델 자체가 쿼리 빌더라고 언급했으므로 쿼리 빌더 스타일을 사용하여 모델을 삭제할 수도 있습니다. 조회수가 0인 기사를 모두 삭제하려면 다음 방법을 사용할 수 있습니다. 🎜rrreee🎜 반환 결과는 삭제된 기사 수입니다. 🎜

🎜2. 소프트 삭제 및 관련 구현🎜

🎜🎜2.1 소프트 삭제 구현🎜🎜🎜위 삭제 방법은 또한 데이터베이스에서 데이터 테이블 레코드를 삭제합니다. 모델은 소프트 삭제도 지원합니다. 🎜🎜소위 소프트 삭제란 데이터 테이블 레코드가 실제로 데이터베이스에서 삭제되는 것이 아니라 테이블 레코드의 식별 상태를 소프트 삭제로 표시하여 쿼리 시 필터링할 수 있도록 하여 해당 테이블이 삭제되는 것을 의미합니다. 기록이 삭제된 것으로 나타납니다. Laravel은 식별 상태로 날짜 필드를 사용합니다. 여기서는 해당 모델이 소프트 삭제된 경우 deleted_at를 사용합니다. 필드는 제거 시간이고, 그렇지 않으면 값이 비어 있습니다. 🎜🎜Eloquent 모델이 소프트 삭제를 지원하도록 하려면 몇 가지 설정을 지정해야 합니다. 먼저, 모델 클래스에서 SoftDeletes 특성을 사용하세요. 이 특성은 소프트 삭제를 위한 일련의 관련 메서드를 제공합니다. 자세한 내용은 소스 코드 IlluminateDatabaseEloquentSoftDeletes를 참조하세요. , $date 속성 배열을 설정하고 그 안에 deleted_at를 배치해야 합니다. 🎜rrreee🎜그런 다음 deleted_at 열을 해당 데이터베이스 에 추가합니다. post, 우리는 마이그레이션을 사용합니다. 이를 달성하기 위해 먼저 Artisan 명령을 실행합니다: 🎜rrreee🎜 그런 다음 생성된 PHP 파일을 다음과 같이 편집합니다: 🎜rrreee🎜 그런 다음 다음을 실행합니다: 🎜rrreee🎜 이렇게 하면 deleted_at가 생성됩니다. <code>게시물의 열입니다. 다음으로, 컨트롤러에 테스트 코드를 작성합니다: 브라우저에서 🎜rrreee🎜Visit http://laravel.app:8000/test, 페이지 출력은 다음과 같습니다: 🎜🎜 🎜🎜 Dang 다음 코드를 통해 다시 한 번 모든 기사를 가져옵니다. 🎜rrreee🎜 ID가 6인 기사는 더 이상 표시되지 않습니다. 🎜🎜🎜2.2 쿼리 결과에 일시 삭제 모델이 포함됨🎜🎜🎜쿼리 결과에 일시 삭제된 레코드를 포함하려면 어떻게 해야 합니까? SoftDeletes 특성에 withTrashed 메서드를 사용할 수 있습니다. 🎜rrreee🎜실행 후 페이지는 다음과 같이 표시됩니다. 🎜🎜🎜🎜ID가 6인 기사는 다음에 나타납니다. 쿼리 결과가 다시 나타납니다. 때로는 일시 삭제된 모델만 보고 싶을 때도 있습니다. SoftDeletes에서 onlyTrashed 메서드를 사용할 수 있습니다. 🎜rrreee🎜실행 후 페이지에 다음 결과가 표시됩니다. 🎜🎜🎜🎜🎜2.3 일시 삭제 복구🎜🎜🎜 때로는 일시 삭제된 모델을 복원해야 할 경우 SoftDeletes에서 제공하는 <code>restore 메서드를 사용할 수 있습니다. : 🎜🎜🎜 단일 모델 복원🎜🎜rrreee🎜🎜여러 모델 복원🎜🎜rrreee🎜🎜모든 모델 복원🎜🎜rrreee🎜🎜관련 쿼리 모델 복원🎜🎜rrreee🎜🎜2.4 강제 삭제🎜🎜 🎜모델이라면 이 모델에 해당하는 데이터베이스 테이블 레코드를 삭제하려면 SoftDeletes에서 제공하는 forceDelete 메서드를 사용할 수 있습니다. 🎜rrreee🎜다음을 살펴보세요. 데이터 테이블을 보면 id=6인 테이블 레코드가 삭제된 것을 확인할 수 있습니다. 존재: 🎜🎜🎜🎜🎜

위 내용은 Laravel의 소프트 삭제 원리는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.