2017-07-27 2 views
2

Gibt es eine schnelle Möglichkeit, Beziehungen anzuhängen, wenn sie nicht bereits angehängt sind. Ich verwende diesen Code, um die Beziehungen eines Modells zu aktualisieren.Laravel-Beziehungen anhängen, wenn nicht bereits angehängt

 if (!empty($request->get('roles')) && is_array($request->get('roles'))) { 
      $message->Roles()->attach($request->get('roles')); 
     } 
     if (!empty($request->get('users')) && is_array($request->get('users'))) { 
      $message->Users()->attach($request->get('users')); 
     } 

Aber ich bekomme diese Fehlermeldung, die ich dieser Fehler bin;

SQLSTATE [23000]: Integrität Einschränkungsverletzung: 1062 doppelte Eintrag '1-41' für die Taste 'primären' (SQL: Einfügen in message_user (message_id, user_id) Werte (1, 41), (1, 42) (1, 43), (1, 44), (1, 45), (1, 46), (1, 47), (1, 48), (1, 49), (1, 50))

Ich möchte vermeiden, durch eine sehr lange Liste von Array-Prüfung gehen, welche Benutzer nicht bereits angeschlossen sind und sie anhängen. Sag mir Bescheid, wenn dies der einzige Weg ist.

Ich denke etwas wie;

$message->Users()->attachIfNotAttached($request->get('users')); 
+0

MySQL unterstützt 'INSERT IGNORE', aber ich glaube nicht, Laravel auch der Fall ist. –

+0

Ich denke, die einzige Lösung ist zu prüfen, ob die Beziehung für jeden Benutzer vor dem Anhängen existiert. – LogicDev

+0

Was ist in '$ request-> get ('users')' gespeichert? Benutzer-IDs? –

Antwort

1

So etwas wie dies funktionieren könnte:

die IDs erhalten, die bereits gebunden sind:

$attachedIds = $message->Users()->whereIn('id', $request->get('users'))->pluck('id'); 

die beigefügten IDs aus dem Anforderungs Array entfernen:

$newIds = array_diff($request->get('users'), $attachedIds); 

Bringen Sie die neue IDs:

$message->Users()->attach($newIds); 
+0

Danke. Das ist, was ich gesucht habe. – LogicDev

2

Laravel hat Verfahren für diese eingebaut - syncWithoutDetaching:

$message->Users()->syncWithoutDetaching($request->get('users')); 
Verwandte Themen