2016-08-03 28 views
1

Es gibt zwei wichtige Modelle Resume und Skill. Resume hat viele Fähigkeiten durch ResumeSkill.Laravel Aufruf zu undefinierter Methode Illuminate Database Query Builder :: detach/attach() für hasManyThrough-Beziehungen

Wenn ich mein Formular mit Fähigkeiten einreiche, bevor ich sie zum Fortsetzen hinzufüge, entferne ich alle Fähigkeiten, die es bereits hat.

Aber ich habe dieses Problem, wenn ich die Methoden laufen attach() und detach():

Call to undefined Methode Illuminate \ Database \ Abfrage \ Builder :: Detach()

Dies ist mein Lebenslauf Modellklasse:

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

class Resume extends BaseModel{ 
    public function skills(){ 
     return $this->hasManyThrough('\myApp\Skill', '\myApp\ResumeSkill'); 
    } 
} 

Und das Hauptskript:

$record = \myApp\Resume::find($id); 
$record->skills()->detach(); 
foreach($skills as $skill_id){ 
    $record->skills()->attach($skill_id); 
} 

Was ist los? Einige Antworten, die ich sehe sagen attach() ist eine BelongsTo-Methode, aber sie müssen alte Antworten sein: https://laravel.com/docs/5.2/eloquent-relationships#has-many-through. Wie auch immer, Associate/Dissociate funktionieren nicht so gut.

@solved

I BelongsToMany verwendet haben sollte. Und attach/detachDOES arbeiten mit dieser Beziehung.

Antwort

2

Der hasManyThrough ist eine Abkürzung für den Zugriff auf entfernte Beziehungen über eine Zwischenbeziehung. Bei Viele-zu-Viele-Beziehungen definieren Sie die Methode "belongsToMany".

public function skills() { 
    return $this->belongsToMany('App\Skill', 'ResumeSkill', 'idResume', 'idSkill'); 
} 
+0

aber es gibt eine Zwischentabelle. Was ist eine entfernte Beziehung? –

+0

In dem Fall haben wir drei Tabellen, wie Länder, Benutzer und Kommentare und ich möchte alle Kommentare eines bestimmten Landes erhalten. Im Ländermodell würde diese Implementierung verwendet: public function comments() {return $ this-> hasManyThrough ('App \ Kommentar', 'App \ User'); } –