Laravel : Speichern einer Zugehörig-zu-Mann-Beziehung

Lesezeit: 4 Minuten

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.

Meine Modellsignatur lautet:

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

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

Mein Controller SignatureController.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 Signatur erstellen und mit einem Benutzer verknüpfen?

Ich habe es versucht

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

Vielen Dank

Benutzeravatar von fahad.hasan
fahad.hasan

In Anbetracht Ihrer Tabellen sind Benutzer, Signaturen und user_signatures

Definieren Sie die Beziehung im Modell: User.php

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

Definieren Sie die Umkehrung der Beziehung in model: Signature.php

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

In Ihrem Controller können Sie Folgendes tun:

//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);

Auch das Gegenteil ist möglich:

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

Wenn Sie eine vorhandene Signatur haben, sollten Sie alternativ Folgendes 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 besseren Beispielen behandelt. Sie sollten die Methoden „attach()“, „detach()“ und „sync()“ überprüfen. Bitte sieh dir das mal an: http://laravel.com/docs/5.0/eloquent#inserting-related-models

  • Danke vielmals ! Es kommt vor, dass ich eine relationale Tabelle mit dem Namen user_signature und nicht signature_user habe, daher gibt mir dieser Befehl einen Fehler, weil die Zieltabelle nicht existiert. Weißt du, was ich tun muss?

    – Yobogs

    8. Juni 2015 um 9:46 Uhr

  • Ändern Sie das zweite Argument in Ihrer Methode „gehört zu“ durch den entsprechenden Tabellennamen. Das sollte es gut aufnehmen.

    – fahad.hasan

    8. Juni 2015 um 9:49 Uhr

  • Es gibt einen Tippfehler in der letzten Codezeile $user->signature() ohne “s” am Ende der Signatur.

    – Spitze

    10. Mai 2021 um 3:44 Uhr

Benutzeravatar des Saiyajin-Prinzen
Saiyajin Prinz

Sie müssen einen Tisch aufgerufen haben user_signature mit folgendem Schema:

$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 deine User Modell sollte die folgende Methode haben:

Model User

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

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

Beim Speichern eines neuen Datensatzes (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 beim Aktualisieren des Datensatzes (der Controller, den Sie für die Signatur verwenden):

/**
 * 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
}

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

    – Yobogs

    8. Juni 2015 um 9:42 Uhr

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

    – Saiyajin-Prinz

    8. Juni 2015 um 9:47 Uhr

Benutzeravatar von Yasen Zhelev
Yasen Zhelev

Zuerst associate erfordert, dass ein Modellobjekt als Argument übergeben wird. 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 deinem Fall. Siehe hier: http://laravel.com/docs/5.0/eloquent#inserting-related-models

Auf dieser Grundlage sollten Sie Folgendes tun:

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

  • Danke vielmals ! Es kommt vor, dass ich eine relationale Tabelle mit dem Namen user_signature und nicht signature_user habe, daher gibt mir dieser Befehl einen Fehler, weil die Zieltabelle nicht existiert. Weißt du, was ich tun muss?

    – Yobogs

    8. Juni 2015 um 9:42 Uhr

1430450cookie-checkLaravel : Speichern einer Zugehörig-zu-Mann-Beziehung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy