Thông thường việc query dữ liệu trong database là việc rất cơ bản, các thao tác như đọc dữ liệu, sắp xếp dữ liệu , xoá dữ liệu và thêm mới dữ liệu được tích hợp trong laravel cũng khá đầy đủ. Riêng việc xoá dữ liệu thì có 2 trường phái là: xoá và ẩn đi trong mỗi query. vậy 2 cách này có ưu điểm và nhược điểm gì ? chúng ta hãy đến với từng phần để hiểu rõ hơn nha.
DELETE FROM table_name
WHERE some_column = some_value
Không giống như xoá cứng, việc xoá mềm chỉ đơn giản là ẩn đi 1 record trong 1 câu truy vấn, lấy ví dụ bảng users chúng ta có :
id | name | phone | is_disabled |
---|---|---|---|
1 | Jone Doe | +849989899867 | 0 |
2 | Maria Zoo | +849989899888 | 0 |
3 | Marina Zoo | +849989899866 | 0 |
DELETE FROM users
WHERE id = 1
=> sau khi chạy lệnh này thì dữ liệu của users chỉ còn :
id | name | phone | is_disabled |
---|---|---|---|
2 | Maria Zoo | +849989899888 | 0 |
3 | Marina Zoo | +849989899866 | 0 |
UPDATE users
SET is_disabled=1
WHERE id=1
=> sau khi chạy lệnh này thì dữ liệu của users sẽ là :
id | name | phone | is_disabled |
---|---|---|---|
1 | Jone Doe | +849989899867 | 1 |
2 | Maria Zoo | +849989899888 | 0 |
3 | Marina Zoo | +849989899866 | 0 |
SELECT * FROM users where is_disabled = 0
=> sau khi chạy lệnh này thì dữ liệu của users chỉ còn :
id | name | phone | is_disabled |
---|---|---|---|
2 | Maria Zoo | +849989899888 | 0 |
3 | Marina Zoo | +849989899866 | 0 |
Rất Hữu ích đúng không nào, record vẫn còn đó nhưng chúng ta không select nó ra mà thôi, đó cũng là cơ chế mà softDeletes trong laravel hoạt động.
where is_disabled = 0
. Nếu select lúc nào cũng where thêm điều kiện này thì thật hơi phiền đúng k nào, chúng ta hãy cùng config softDeletes trong laravel nhé.composer create-project --prefer-dist laravel/laravel soft_delete_laravel
use Illuminate\Support\Facades\Schema; // add
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191); // add: default varchar(191)
}
}
trong model User chúng ta thêm
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\SoftDeletes; // add soft delete
class User extends Authenticatable
{
use Notifiable,
SoftDeletes;// add soft delete
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
}
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
$table->softDeletes(); // add
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
$table->softDeletes();
sẽ tạo ra cột deleted_at với giá trị mặc định là null (tương tự với cột is_disabled có giá trị mặc địnhlà 0)php artisan migrate
App\User::where('id', 1)->delete();
=> Khi ta gọi method delete cho users có id bằng 1 thì ở tại record này sẽ update cột deleted_at với giá trị khác null ( khi xoá sẽ cập nhật thời gian )App\User::all();
sẽ lấy ra tất cả record trong bảng users không bao gồm record có deleted_at khác null. Rất clear đúng không nào.App\User::withTrashed()->get();
App\User::onlyTrashed()->get();
App\User::withTrashed()->where('id', 1)->restore();
App\User::withTrashed()->where('id', 1)->forceDelete();