2013-06-27 20 views
13

Jak ustawić opcję usuwania miękkiego w tabeli pośredniej, która łączy dwa różne typy obiektów? Dodałem deleted_at kolumny, ale docs powiedzieć, że muszę umieścić ten do modelu:Miękkie usuwanie w tabeli pośredniej dla relacji wiele do wielu

protected $softDelete = true; 

Oczywiście, nie mam model tabeli pośredniej. Każdy pomysł?

+0

Inną alternatywą jest, aby spróbować to https://github.com/mlezcano1985/laravel-pivot-soft-deletes –

Odpowiedz

45

można umieścić ograniczenie na Eager obciążenie:

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` 

    } 

Zamiast HARD usuwając zależność używając:

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

Należy użyć coś takiego SOFT usuwać zamiast:

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

Czy użytkownik belongsToMany bierze delete_at na konto? –

+0

Tak. Do tego służy 'whereNull ('group_user.deleted_at')'. –

+0

@RonaldHulshof Próbowałem w ten sposób, jak miękkiego usuwania przy użyciu 'User :: find (1) -> groups() -> detach();' – iatboy

3

O ile rozumiem; tabela pośrednia jest po prostu długością łańcucha dołączającą jeden rekord tabeli do rekordu w innej tabeli i jako taka nie wymaga metody miękkiego usuwania.

Aby wytłumaczyć, wyobraź sobie, że masz tabelę użytkowników i tabelę grup, każdy użytkownik może mieć więcej niż jedną grupę, a każda grupa może należeć do więcej niż jednego użytkownika. Twoja tabela przestawna może być User_Group lub coś podobnego i zawiera po prostu dwie kolumny: user_id i group_id.

Twój User stół i Group tabela powinna mieć kolumnę deleted_at dla miękkich usuwa więc kiedy „delete” powiedzieć grupie, że stowarzyszenie grupa nie pojawi się w $User->Groups() natomiast pivot wiersz tabeli pozostała nienaruszona. Jeśli przywrócisz usuniętą grupę, po raz kolejny pojawi się ona w $User->Groups().

Wiersz tabeli przestawnej powinien mieć wpływ tylko wtedy, gdy rekord grupy jest twardy usunięty, w takim przypadku wiersze przestawne również powinny być trudne do usunięcia.

Teraz wyjaśniłem, dlaczego nie uważam, że należy dodać miękkie usuwanie do tabeli przestawnej; czy nadal istnieje powód, dla którego potrzebujesz tego zachowania?

+2

Co potrzebne jest, aby wiedzieć, że użytkownik był związany z grupą, więc dlatego muszę miękka delete - to połączenie pozostaje w bazie danych, chociaż nie jest aktywne. Ma sens? – misaizdaleka

+0

Ach tak, w takim przypadku możesz dodać dodatkowy wiersz do tabeli przestawnej, na przykład 'usunięty_at', a następnie wykonać odpowiedź R. Hulshof :) – carbontwelve

3

Można również użyć metody Eunquent BelongsToany firmy Laravel: updateExistingPivot .

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

Aby korzystać z przykładów @RonaldHulshof, masz model użytkownika o relacji grupy, która jest relacją belongsToMany.

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

Następnie w celu miękkiego usunięcia wpisu tabeli przestawnej należy wykonać następujące czynności.

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