2013-06-27 15 views
13

Wie setze ich Soft-Delete auf eine Zwischentabelle, die zwei verschiedene Arten von Entitäten verbindet? Ich habe deleted_at Spalte hinzugefügt, aber die docs sagen, dass ich diese in das Modell setzen:Soft-Löschung in einer Zwischentabelle für Viele-zu-Viele-Beziehung

protected $softDelete = true; 

Natürlich, ich habe nicht ein Modell für einen Zwischentisch haben. Irgendeine Idee?

+0

Eine weitere Alternative ist zu versuchen, diese https://github.com/mlezcano1985/laravel-pivot-soft-deletes –

Antwort

45

Sie eine Einschränkung für die Eager laden setzen können:

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` 

    } 

Statt HARD die Beziehung zu löschen verwenden:

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

Sie sollten stattdessen so etwas zu SOFT löschen verwenden:

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

Hat die angleToMany deleted_at in account? –

+0

Ja. Das ist, wofür 'whereNull ('group_user.deleted_at')' ist. –

+0

@RonaldHulshof Ich habe diesen Weg versucht, wie man mit 'User weich löscht: find (1) -> groups() -> detach();' – iatboy

3

Soweit ich es verstehe; Eine Zwischentabelle ist einfach eine Länge der Zeichenkette, die einen Tabellensatz an einen Datensatz in einer anderen Tabelle anfügt, und als solche erfordert sie keine Soft-Delete-Methode.

Stellen Sie sich vor, Sie haben eine Benutzer- und eine Gruppentabelle, jeder Benutzer kann mehr als eine Gruppe haben und jede Gruppe kann mehr als einem Benutzer angehören. Ihre Pivot-Tabelle kann User_Group oder etwas ähnliches sein und sie enthält einfach zwei Spalten user_id und group_id.

Ihre User Tisch und Group Tabelle sollte eine deleted_at Spalte für weiche Löschungen haben, also, wenn Sie „löschen“, um eine Gruppe sagen, wird die Gruppenzugehörigkeit erscheinen nicht in $User->Groups() während die Pivot-Tabelle Reihe unberührt geblieben ist. Wenn Sie dann diese gelöschte Gruppe wiederherstellen, wird sie erneut in $User->Groups() angezeigt.

Die Pivot-Tabellenzeile sollte nur betroffen sein, wenn dieser Gruppendatensatz hart gelöscht wird. In diesem Fall sollten die Pivot-Zeilen ebenfalls gelöscht werden.

Jetzt habe ich erklärt, warum ich glaube nicht, dass Sie Soft Delete zu einer Pivot-Tabelle hinzufügen müssen; Gibt es noch einen Grund, warum Sie dieses Verhalten brauchen?

+2

Was ich brauche, ist, dass der Benutzer zu wissen, wurde zu einer Gruppe verwendet, ist also, warum ich weich brauchen delete - Diese Verbindung bleibt in der db, obwohl sie nicht aktiv ist. Macht Sinn? – misaizdaleka

+0

Ah ja, in diesem Fall können Sie eine zusätzliche Zeile auf Ihrer Pivot-Tabelle hinzufügen wie 'deleted_at' und dann R. Hulshofs Antwort folgen :) – carbontwelve

3

Sie könnten auch Laravels Eloquent BelongsToMany-Methode updateExistingPivot verwenden .

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

So @RonaldHulshof Beispiele verwenden Sie ein User-Modell mit einer Gruppen-Beziehung, die eine belongsToMany Beziehung.

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

Dann, um den Pivot-Tabelleneintrag weich zu löschen, würden Sie Folgendes tun.

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