2013-11-20 15 views
10

Ich habe 2 Tabellen, Clients und Projekte und ein Projekt ist mit einem Client verbunden. Sowohl die Clients als auch die Projekte implementieren weiche Löschvorgänge, um die Beziehungen aus Archivierungsgründen aufrechtzuerhalten, d. H. Selbst wenn ich einen Client lösche, weist das Projekt immer noch die Client-Information auf.Laravel 4: Eloquent Soft löscht und Beziehungen

Mein Problem ist, dass wenn ich den Client lösche, die Referenz aus dem Projekt nicht mehr zugänglich ist und eine Ausnahme auslöst. Ich möchte den Client sanft löschen, aber die Client-Daten aus der Projektbeziehung beibehalten.

Mein Klinge Code ist wie folgt:

@if ($projects->count()) 
<table class="table table-striped table-bordered"> 
    <thead> 
     <tr> 
      <th>Name</th> 
      <th>Client</th> 
     </tr> 
    </thead> 

    <tbody> 
     @foreach ($projects as $project) 
      <tr> 
       <td>{{{ $project->name }}}</td> 
       <td>{{{ $project->client->name }}}</td> 
       <td>{{ link_to_route('projects.edit', 'Edit', array($project->id), array('class' => 'btn btn-info')) }}</td> 
       <td> 
        {{ Form::open(array('method' => 'DELETE', 'route' => array('projects.destroy', $project->id))) }} 
         {{ Form::submit('Delete', array('class' => 'btn btn-danger')) }} 
        {{ Form::close() }} 
       </td> 
      </tr> 
     @endforeach 
    </tbody> 
</table> @else There are no projects @endif 

Hier sind die Migrationen:

 Schema::create('clients', function(Blueprint $table) { 

     // Table engine 
     $table->engine = 'InnoDB'; 

     // Increments 
     $table->increments('id'); 

     // Relationships 

     // Fields 
     $table->string('name'); 

     // Timestamps 
     $table->timestamps(); 

     // Soft deletes 
     $table->softDeletes(); 

    }); 


     Schema::create('projects', function(Blueprint $table) { 

     // Table engine 
     $table->engine = 'InnoDB'; 

     // Increments 
     $table->increments('id'); 

     // Relationships 
     $table->integer ('client_id'); 

     // Fields 
     $table->string('name'); 

     // Timestamps 
     $table->timestamps(); 

     // Soft deletes 
     $table->softDeletes(); 

     // Indexes 
     $table->index('client_id'); 


    }); 

Vielen Dank.

+1

Haben Sie versucht mit ':: withTrashed()'? –

+0

Können Sie Migrationen anzeigen? Wie und was genau willst du löschen? – carousel

+0

Ich versuche, den Client zu löschen (soft delete), behalte aber den Clientnamen beim Anzeigen des Projekts, das mit dem Client verwandt war. – Wally

Antwort

29

Dies wurde mit der Methode withTrashed() beim Definieren der Beziehung im Modell gelöst.

Originalcode:

public function client() { 
    return $this->belongsTo('Client'); 
} 

Lösung:

public function client() { 
    return $this->belongsTo('Client')->withTrashed(); 
} 

Vielen Dank gerne.

+0

funktioniert auch für mich! – od3n

3

In meinem Fall kann ich die Funktion client nicht ändern wie Wally vorgeschlagen, weil es in anderen Modellen und Controllern verwendet wird, die ich nicht möchte, dass es Clients ->withTrashed() erhält.

In diesem Fall ist hier zwei Lösungen, die ich vorschlagen:

->withTrashed() Geben Sie bei eager loading-Client:

$projects = Project::with(['client' => function($query){ $query->withTrashed(); }])->get(); 

oder eine neue client Funktionen ->withTrashed()

public function client() { 
    return $this->belongsTo('Client'); 
} 

// The new function 
public function client_with_trash() { 
    return $this->belongsTo('Client')->withTrashed(); 
} 

Wenn eager loading erstellen jetzt:

$projects = Project::with(['client_with_trash'])->get(); 
Verwandte Themen