2015-06-08 13 views
11

Ich möchte eine neue Signatur in meiner Tabellensignatur speichern. Jede Signatur kann mit mehreren Benutzern verknüpft werden. Ich habe eine viele zu viele Tabelle zwischen Benutzern und Signaturen.Laravel: Speichern einer "angleToMany" -Beziehung

My Model Signature ist:

class Signature extends Model { 
    public $fillable = ['name', 'template']; 

    public function users() { 
     return $this->belongsToMany('App\User'); 
    } 
} 

mein Controller SigantureController.php ist:

public function store(CreateSignaturesRequest $request) 
{ 
    //return $user_id; 
    $values = $request->only(['name','template']); 

    Signature::create($values)); 

    return response()->json(['message'=>'SUCCESS'], 201); 

} 

Wie kann ich meine Unterschrift zu erstellen und es einem Benutzer zu verknüpfen?

Ich versuchte

Signature::create($values)->associate($user_id); 

Dank

Antwort

19

Betrachtet man die Tabellen sind Benutzer, Signaturen und user_signatures

definieren die Beziehung in Modell: User.php

class User extends Model { 
    public function signatures() { 
     return $this->belongsToMany('\App\Signature', 'user_signatures'); 
    } 
} 

Definieren Sie die Umkehrung der Beziehung im Modell: Signatur.php

class Signature extends Model {  
    public function users() { 
     return $this->belongsToMany('\App\User', 'user_signatures'); 
    } 
} 

In Ihrem Controller Sie Folgendes tun können:

//create a new signature 
$signature = new Signature($values); 
//save the new signature and attach it to the user 
$user = User::find($id)->signatures()->save($signature); 

Das Gegenteil ist möglich zu:

$user = User::find($user_id); 
$signature = Signature::create($values)->users()->save($user); 

Alternativ, wenn Sie eine vorhandene Signatur haben, sollten Sie tun:

$user = User::find($id); 
$user->signature()->attach($signature->id); 

Bitte beachten Sie, dass attach() und detach() eine ID oder ein Array von IDs akzeptiert.

Laravel docs hat dies in viel mehr Details und bessere Beispiele abgedeckt. Sie sollten die Methoden attach(), detach() und sync() überprüfen. Bitte schauen Sie: http://laravel.com/docs/5.0/eloquent#inserting-related-models

+0

Vielen Dank! Es kommt vor, dass ich eine relationale Tabelle namens user_signature und nicht signature_user habe, daher gibt dieser Befehl mir einen Fehler, weil die Zieltabelle nicht existiert. Weißt du, was ich tun muss? – Yobogs

+2

Ändern Sie das zweite Argument in Ihrer Methode "eventsTo" mit dem entsprechenden Tabellennamen. Das sollte es gut aufnehmen. –

4

Sie benötigen eine Tabelle user_signature haben, mit dem folgenden Schema genannt:

$table->integer('user_id')->unsigned(); 
$table->integer('signature_id')->unsigned(); 

$table->foreign('user_id')->references('id')->on('users'); 
$table->foreign('signature_id')->references('signatures')->on('users'); 

Dann wird Ihr User Modell sollte die folgende Methode haben:

Model User

public function signatures() { 
    return $this->belongsToMany('App\Signature'); 
} 

Nachdem Sie nun die Many-To-Many Beziehung zwischen den Modellen entwickelt haben, was Sie tun können, ist dies:

Während einen neuen Datensatz zu speichern (der Controller, den Sie für die Signatur verwenden):

/** 
* Insert the signature 
* 
* @param Request $request 
* @return ... 
*/ 
public function store(Request $request) { 
    // your validation 

    $signature->users()->attach($request->input('user_id')); 

    // return 
} 

Ähnlich während der Aktualisierung des Datensatzes (der Controller, den Sie für die Signatur verwendet werden):

/** 
* Update the signature with the particular id 
* 
* @param $id 
* @param Request $request 
* @return ... 
*/ 
public function update($id, Request $request) { 
    // your validation 

    $signature->users()->sync($request->input('user_id')); 

    // return 
} 
+0

Vielen Dank, sehr klare Antwort! Allerdings muss ich das Speichern auf der Signaturseite vornehmen. nicht auf der Benutzerseite. Ist das möglich ? Wie ? – Yobogs

+1

Ich habe die Antwort bearbeitet, Sie können sie sich ansehen. –

2

Zunächst muss associate ein Modellobjekt als Argument übergeben werden. Siehe hier: http://laravel.com/api/5.0/Illuminate/Database/Eloquent/Relations/BelongsTo.html#method_associate

Ist auch für belongsTo Beziehungen, nicht Many to Many wie in Ihrem Fall ist. Siehe hier: http://laravel.com/docs/5.0/eloquent#inserting-related-models

Basierend auf das, was Sie tun sollten, ist:

Signature::create($values)->users()->attach($user_id); 
+0

Vielen Dank! Es kommt vor, dass ich eine relationale Tabelle namens user_signature und nicht signature_user habe, daher gibt dieser Befehl mir einen Fehler, weil die Zieltabelle nicht existiert. Weißt du, was ich tun muss? – Yobogs