[Bài đọc] Xoá model

3. Làm việc với Cơ sở dữ liệu

Để xóa một model, gọi phương thức delete của model instance: 

$flight = App\Flight::find(1);
$flight->delete();

Xóa một model đã tồn tại bằng khóa

Trong ví dụ trước, chúng ta lấy model từ cơ sở dữ liệu trước khi gọi phương thức delete. Tuy nhiên, nếu biết khóa chính của model, bạn có thể xóa model mà không cần lấy nó ra. Để làm điều này, gọi phương thức destroy:

App\Flight::destroy(1);

App\Flight::destroy([1, 2, 3]);

App\Flight::destroy(1, 2, 3); 

Xóa model bằng truy vấn

Tất nhiên, bạn cũng có thể thực thi lệnh xóa trên một tập các model. Trong ví dụ này, chúng ta sẽ xóa tất cả các flight mà được đánh dấu là inactive. Như mass update, mass delete sẽ không sinh ra sự kiện cho các model bị xóa:

$deletedRows = App\Flight::where('active', 0)->delete();

Lưu ý: Khi thực hiện một mass delete qua Eloquent, sự kiện deleting và deteted model sẽ không phát sinh cho các delete model. Bởi vì các model thực ra chưa bao giờ được lấy khi thực thi lệnh delete.

Soft Deleting (Xoá mềm)

Thay vì thực sự xóa các bản ghi khỏi cơ sở dữ liệu, Eloquent cũng có để soft delete các model. Khi model được soft deleted, chúng chưa thực sự bị xóa khỏi cơ sở dữ liệu. Thay vì thế, một một trường là deleted_at sẽ được thiết lập trong model và chèn vào trong cơ sở dữ liệu. Nếu model có giá trị deleted khác NULL, tức là model đã bị soft deleted. Để kích hoạt soft delete cho một model, sử dụng trait Illuminate\Database\Eloquent\SoftDeletes trên model và thêm vào cột deleted_at trong thuộc tính $dates:

<?php
namespace App;

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

class Flight extends Model
{
    use SoftDeletes;

    /**
     * The attributes that should be mutated to dates.
     *
     * @var array
     */
    protected $dates = ['deleted_at'];
}

Tất nhiên, bạn cần thêm cột deleted_at vào trong bảng. Laravel schema builder cung cấp phương thức trợ giúp để tạo cột này: 

Schema::table('flights', function ($table) {    $table->softDeletes();}); 

Bây giờ, khi bạn gọi phương thức delete trên model, cột deleted_at sẽ được thiết lập thời gian và ngày hiện tại. Và khi thực hiện truy vấn một model có sử dụng soft delete, thì model đó sẽ tự động loại khỏi tất cả các kết quả của truy vấn:

Để kiểm tra liệu model instance đưa ra đã hoàn toàn bị xóa chưa, sử dụng phương thức trashed:

if ($flight->trashed()) {    //}

Truy vấn các model đã xoá mềm

Lấy thêm các model đã xoá mềm

Như lưu ý trên, soft deleted model sẽ tự động tách khỏi tập kết quả truy vấn. Tuy nhiên, bạn có thể ép các soft deleted model xuất hiện trên tập kết quả khi sử dụng phương thức withTrashed: 

$flights = App\Flight::withTrashed()
                ->where('account_id', 1)
                ->get();

Ngoài ra, cũng có thể sử dụng phương thức withTrashed cho các truy vấn có liên quan đến nhau: 

$flight->history()->withTrashed()->get();

Chỉ lấy về các model đã xoá mềm

Phương thức onlyTrashed lấy về các soft deleted model:

$flights = App\Flight::onlyTrashed()
                ->where('airline_id', 1)
                ->get();

Phục hồi Soft Deleted Model

Thỉnh thoảng bạn muốn khôi phục một soft deleted model. Để làm điều này sử dụng phương thức restore trong model instance:

$flight->restore();

Phương thức restore cũng được sử dụng trên một truy vấn để nhanh chóng khôi phục lại nhiều model. Một lần nữa, giống như khi thao tác với “mass”, sẽ không có bất kỳ sự kiện nào cho model được khôi phục lại:

App\Flight::withTrashed()
        ->where('airline_id', 1)
        ->restore();

Giống như phương thức withTrashed, phương thức restore cũng được sử trên các truy vấn liên quan với nhau:

$flight->history()->restore();

Xóa model vĩnh viễn (Permanently Deleting Models)

Đôi khi bạn cần xóa một hoàn toàn một model khỏi cơ sở dữ liệu. Để xóa một soft deleted model vĩnh viễn khỏi cơ sở dữ liệu, sử dụng phương thức forceDelete:

// Force deleting a single model instance...

$flight->forceDelete();


// Force deleting all related models...

$flight->history()->forceDelete();

Leave a Reply

Your email address will not be published. Required fields are marked *