laravel에서 소프트 삭제란 데이터 테이블 레코드가 실제로 데이터베이스에서 삭제되는 것이 아니라, 테이블 레코드의 표현 상태를 소프트 삭제로 표시하여 쿼리 시 해당 테이블 레코드를 필터링할 수 있도록 하는 것을 의미합니다. "삭제"되었습니다.
이 기사의 운영 환경: Windows 10 시스템, Laravel 버전 6, Dell G3 컴퓨터.
1. 모델 삭제
1.1 삭제를 사용하여 모델 삭제
모델 삭제는 매우 간단합니다. 그런 다음 delete
메소드를 호출하세요. delete
方法即可:
$post = Post::find(5); if($post->delete()){ echo '删除文章成功!'; }else{ echo '删除文章失败!'; }
该方法返回true
或false
。
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.1 软删除实现
上述删除方法都会将数据表记录从数据库删除,此外Eloquent模型还支持软删除。
所谓软删除指的是数据表记录并未真的从数据库删除,而是将表记录的标识状态标记为软删除,这样在查询的时候就可以加以过滤,让对应表记录看上去是被”删除“了。Laravel中使用了一个日期字段作为标识状态,这个日期字段可以自定义,这里我们使用deleted_at
,如果对应模型被软删除,则deleted_at
字段的值为删除时间,否则该值为空。
要让Eloquent模型支持软删除,还要做一些设置。首先在模型类中要使用SoftDeletes
trait,该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 = 'posts'; //设置主键 public $primaryKey = 'id'; //设置日期时间格式 public $dateFormat = 'U'; protected $guarded = ['id','views','user_id','updated_at','created_at']; protected $dates = ['delete_at']; }
然后对应的数据库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('posts', 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로 여러 모델 삭제:
destroy
메서드를 호출하세요. 🎜🎜🎜1.3 쿼리 빌더를 사용하여 모델 삭제🎜🎜🎜 앞서 Eloquent 모델 자체가 쿼리 빌더라고 언급했으므로 쿼리 빌더 스타일을 사용하여 모델을 삭제할 수도 있습니다. 조회수가 0인 기사를 모두 삭제하려면 다음 방법을 사용할 수 있습니다. 🎜rrreee🎜 반환 결과는 삭제된 기사 수입니다. 🎜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 중국어 웹사이트의 기타 관련 기사를 참조하세요!