2017-06-02 16 views
1

Bei einer Abfrage mehrere Werte aus einem Modell zu finden, würde eloquent wie folgt aussehen:Laravel whereIn Listenwerte nicht in Abfrage gefunden?

return Contact::whereIn('user_name', explode(',', $userNames)

Aber lassen Sie uns sagen, dass der Wert für userNames['foo', 'bar']; ist, aber ich habe nur foo als gültiger Benutzername, Gibt es eine Möglichkeit, bar (alle fehlgeschlagen zu finden) als Teil der gleichen Abfrage, ohne das Ergebnis ->get() gegen die Anfrage zu vergleichen?

+0

Sie möchten also die Liste der Benutzernamen aus den Anfragedaten herausfiltern? Bitte präzisieren Sie mit was Sie brauchen. – Sandeesh

+0

Sie wollen also eine Liste von Kontaktobjekten mit diesem Benutzernamen, auch wenn kein solcher Kontakt in der Datenbank existiert? – Jerodev

+1

Ich arbeite an demselben Projekt wie dieser hübsche Mensch. Wir suchen nach einer Möglichkeit, 2 Listen zurück zu bekommen - eine mit den Übereinstimmungen und eine mit den Benutzernamen, die nicht gefunden wurden. – Sydgren

Antwort

0

Sie können Array diff verwenden, um den ungültigen Wert aus der Auswahlregion zu entfernen, und Sie haben ->get() verloren, um die Ergebnisse zu erhalten;

+2

Ich weiß das .... Wie ist das eine gültige Antwort auf die Frage? – jycr753

+0

@ jycr753 Ich habe deine Frage verpasst, habe ich bearbeitet. –

0

Es ist nicht möglich, die Abfrage zu erhalten, die Liste des Benutzernamens, der nicht existiert, von der gegebenen Bedingung zurückzugeben. Aber du könntest das tun.

$allUserNames = explode(',', $userNames); 

$validUserNames = Contact::whereIn('user_name', $allUserNames) 
    ->pluck('user_name') 
    ->toArray(); 

$invalidUserNames = array_values(array_diff($allUserNames, $validUserNames)); 
+0

Ja, das ist, wovor ich Angst hatte, da ich nichts nützliches im Quellcode gefunden habe, das Problem ist, dass es schlecht ist, wenn die Ergebnisse wirklich groß sind, da die Sammlung sehr schlecht ist, um große Datenmengen zu verarbeiten – jycr753

+0

Sie müssen keine Sammlungen verwenden. Wählen Sie nur die Spalte 'user_name' aus und geben Sie das Abfrageergebnis in ein Array um. Ich habe das Beispiel nur mit Zupfen gezeigt. – Sandeesh

+0

Ja, aber ich denke, dass ich nach dieser Sammlung einen besseren Weg finden muss, da das Abfrageergebnis Millionen betragen wird und es nicht optimal oder schnell ist, es auf diese Weise auszuführen. – jycr753