2013-06-27 11 views
13

Làm cách nào để đặt xóa mềm trên bảng trung gian đang kết nối hai loại thực thể khác nhau? Tôi đã thêm cột deleted_at, nhưng các tài liệu nói rằng tôi cần phải đưa điều này vào mô hình:Xóa mềm trên bảng trung gian cho mối quan hệ nhiều-nhiều

protected $softDelete = true; 

Tất nhiên, tôi không có mô hình cho bảng trung gian. Bất kỳ ý tưởng nào?

+0

Một lựa chọn khác là cố gắng này https://github.com/mlezcano1985/laravel-pivot-soft-deletes –

Trả lời

45

Bạn có thể đặt một hạn chế về Load Háo hức:

public function groups() 
    { 

     return $this 
     ->belongsToMany('Group') 
     ->whereNull('group_user.deleted_at') // Table `group_user` has column `deleted_at` 
     ->withTimestamps(); // Table `group_user` has columns: `created_at`, `updated_at` 

    } 

Thay vì HARD xóa các mối quan hệ sử dụng:

User::find(1)->groups()->detach(); 

Bạn nên sử dụng một cái gì đó như thế này để SOFT xóa thay vì:

DB::table('group_user') 
    ->where('user_id', $user_id) 
    ->where('group_id', $group_id) 
    ->update(array('deleted_at' => DB::raw('NOW()'))); 
+0

Có phải thuộc tínhToToMany thực hiện xóa tài khoản? –

+0

Có. Đó là những gì 'whereNull ('group_user.deleted_at')' là cho. –

+0

@RonaldHulshof Tôi đã thử cách này, cách xóa mềm bằng cách sử dụng 'Người dùng :: tìm (1) -> nhóm() -> tách(); ' – iatboy

3

Theo như tôi hiểu; một bảng trung gian chỉ đơn giản là độ dài của chuỗi gắn một bản ghi bảng vào một bản ghi trong một bảng khác và do đó nó không yêu cầu một phương thức xóa mềm.

Để giải thích, hãy tưởng tượng bạn có bảng Người dùng và bảng Nhóm, mỗi người dùng có thể có nhiều Nhóm và mỗi Nhóm có thể thuộc nhiều hơn một Người dùng. Bảng tổng hợp của bạn có thể là User_Group hoặc thứ gì đó tương tự và nó chỉ chứa hai cột user_idgroup_id.

bạn User bảng và Group bảng cần phải có một cột deleted_at cho xóa mềm mại, vì vậy khi bạn "xóa" nói một Group, mà hiệp hội nhóm sẽ không xuất hiện trong $User->Groups() trong khi bảng hàng trục vẫn không bị ảnh hưởng. Nếu sau đó bạn khôi phục nhóm đã xóa đó, nó sẽ lại xuất hiện trong $User->Groups().

Hàng của bảng tổng hợp chỉ bị ảnh hưởng nếu bản ghi nhóm đó bị xóa cứng, trong trường hợp này, các hàng trục cũng sẽ bị xóa cứng.

Bây giờ tôi đã giải thích lý do tại sao tôi không tin rằng bạn cần phải thêm xóa mềm vào bảng tổng hợp; vẫn còn một lý do tại sao bạn cần hành vi này?

+2

Những gì tôi cần là phải biết người dùng có liên quan đến một nhóm, vì vậy đó là lý do tại sao tôi cần phần mềm xóa - kết nối này vẫn còn trong db, mặc dù nó không hoạt động. Có ý nghĩa? – misaizdaleka

+0

À vâng, trong trường hợp này bạn có thể thêm một hàng bổ sung trên bảng tổng hợp của bạn, chẳng hạn như 'deleted_at' và sau đó làm theo câu trả lời của R. Hulshof :) – carbontwelve

3

Bạn cũng có thể sử dụng phương pháp Eloquent BelongsToMany của Laravel updateExistingPivot .

$model->relation->updateExistingPivot($relatedId, ['deleted_at' => Carbon\Carbon::now()]); 

Vì vậy, để sử dụng @RonaldHulshof ví dụ bạn có Mô hình người dùng với mối quan hệ nhóm là mối quan hệ thuộc vềToTo.

public function groups() { 
    return $this->belongsToMany(Group::class)->whereNull('groups_users.deleted_at')->withTimestamps(); 
} 

Sau đó, để mềm xóa các entry bảng pivot bạn sẽ làm như sau.

$user->groups->updateExistingPivot($groupId, ['deleted_at' => Carbon\Carbon::now()]);