2017-07-18 2 views
1

Ich arbeite an einem API-Endpunkt, der eine Liste der Benutzer zurückgibt, die über alle angegebenen Dienst-IDs verfügen.

In meinem Fall:

  • Benutzer können viele Dienste haben
  • Tables: 'Nutzer', 'Dienstleistungen', 'service_user'

ich ein Array über Vue JS am Übergang zu mein Endpunkt zum Beispiel:

/endpoint/32,35,38 

Meine Frage ist jetzt:

$servicesArray = explode(',', $services); 

$users = User::whereHas('services', function ($query) use ($servicesArray) { 
      foreach ($servicesArray as $key => $value) { 
       $query->where('id', $value); 
      } 
     }) 
     ->get(); 

Das Problem ist, dass es jetzt Ergebnisse zurückgibt, auch wenn ein Benutzer die richtigen Dienste hat. Meine Beziehung ist in Ordnung, und wenn ich nur einen Dienst an den Endpunkt übergebe, gibt er einen Benutzer korrekt zurück, dem dieser Dienst zugewiesen wurde. Ich habe whereIn zuvor verwendet, aber ich muss nur Benutzer anzeigen, die ALLE im Endpunktarray angegebenen Dienste haben.

Ein offensichtlicher Grund, warum, was ich habe, funktioniert nicht wie erwartet?

+0

@BenRoob Es gibt, aber das gibt alle Ergebnisse zurück, wo alle Array-Werte übereinstimmen. Ich brauche diese, um nur dorthin zurückzukehren, wo alle Array-Felder übereinstimmen. – Lovelock

+0

Sorry, total vermisst ... Ich werde meine Scheiße löschen !! – BenRoob

Antwort

1

Ich würde so etwas wie dies versuchen:

$q = User::query(); 

foreach ($servicesArray as $key => $value) { 
    $q->whereHas('services', function ($query) use ($value) { 
     $query->where('id', $value); 
    }); 
} 

$users = $q->get(); 
+0

Interessante Idee, bekommen "Objekt der Klasse Illuminate \ Database \ Eloquent \ Builder konnte nicht in String umgewandelt werden" zur Zeit so sortieren, bevor Sie entscheiden, ob dieser Weg funktioniert. – Lovelock

+0

In der ursprünglichen Abfrage scheint es, als ob Sie versuchen, einen Dienst mit allen drei IDs zu finden. Die Antwort lautet, dass Sie mit einer ID nach drei Services suchen müssen. Ich weiß nicht, ob die Idee klar ist, aber das habe ich versucht. – Laerte

+0

Es wurde mit Ihrer Idee gelöst, aber optimiert. Das Problem war, dass ich meine Abfrage etwas wie '$ query' nennen muss und dann $ users = $ query-> get() zurückgeben. – Lovelock

0

Sie können auch Laravel hasMany realationship Funktion für immer mehrere Datensätze aus anderen Tabelle verwenden.

Beispiel:

--- In dem Controller verwendet Abfrage wie.

$users = User::with('services')->where('id', $value)->get(); 

--- Und in Ihrem wie diese Klasse verwenden Sie die Funktion Dienste des Modells.

function services(){ 
    return $this->hasMany('App\Service','user_id','id'); 
} 
Verwandte Themen