So habe ich eine einfache Tabelle:Merging zwei Arrays mit Modellen
messages:
- id
- user_id - user that "sent" the message (the author)
- to_user_id - user that "received" the message
- body
- created_at
- updated_at
Ich bin mit Laravel 5.2, habe ich ein Modell, das wie folgt aussieht:
class Message extends Model
{
public function user()
{
return $this->belongsTo('App\Models\User'); //This should return only the sender
}
public function scopeSentByUser($query, $user_id)
{
return $query->where('user_id', '=', $user_id);
}
public function scopeReceivedByUser($query, $user_id)
{
return $query->orWhere('to_user_id', '=', $user_id);
}
public function scopeNewestFirst($query)
{
return $query->orderBy('created_at', 'DESC');
}
}
In meinem Controller Ich habe zwei Variablen, die wenige Modellmethoden aufrufen:
Ich frage mich, wie kann ich sie in Threads zusammenführen. Im Grunde habe ich nichts wie Threads in meiner App. Benutzer können Nachrichten zwischen schreiben und es ist ein einzelner Thread. Wie das soziale Netzwerk von Zuckerberg oder der Chat-Client von Google.
Ich möchte, dass sie zu halten, um in der Lage sein (oder kann ich sie nach dem Gruppieren bestellen) und haben so etwas wie:
$threads = [
[
'participants' => [1, 2], //those are users' ids
'messages' => [
(Model)Message,
(Model)Message,
(Model)Message,
(Model)Message,
(Model)Message
]
]
];
bearbeiten:
auf der akzeptierte Antwort Basierend I ended up mit dem folgenden Code:
$query = self::where('user_id', $logged_user_id)->orWhere('to_user_id', $logged_user_id)->get();
$inUserId = $query->lists('user_id')->toArray();
$inToUserId = $query->lists('to_user_id')->toArray();
$mergedIds = array_merge($inUserId, $inToUserId);
$uniqueIds = array_unique($mergedIds);
unset($uniqueIds[array_search($logged_user_id, $uniqueIds)]); //Remove logged in user ID
$combinations = [];
foreach ($uniqueIds as $id) {
$combinations[] = [$id, $logged_user_id];
}
$threads = [];
foreach ($combinations as $key => $combo) {
$threads[] = [
'receiver' => $combo[0] == $logged_user_id ? User::find($combo[1]) : User::find($combo[0]),
'messages' => self::where(function ($query) use ($combo) {
$query->where('user_id', $combo[0])->where('to_user_id', $combo[1]);
})->orWhere(function ($query) use ($combo) {
$query->where('user_id', $combo[1])->where('to_user_id', $combo[0]);
})->orderBy('created_at', 'ASC')->get()
];
}
return $threads;
die Unterschiede sind: pluck()
ist repla ced mit lists()->toArray()
Nach dem Zusammenführen der Arrays (array_merge
) und nur die eindeutigen Werte (array_unique
) Ich deaktiviere die angemeldete Benutzer-ID. Weil ich es nicht brauche.
Auch diese Methode entfernt, um die verschiedenen Paare zu erhalten, da es nicht anwendbar ist. Ich glaube, es sollte jetzt richtig funktionieren.
Wird nach einigen komplexeren Tests aktualisiert.
Ich habe dies als Update geschrieben, da ich Antworten nicht bearbeiten kann. Und meine Korrekturen sind zu wenig, um meine eigene Antwort zu veröffentlichen.
Woher kommt die andere Benutzer-ID? – Samsquanch
Nun, wenn ich Ihnen eine Nachricht gebe, wird meine ID in 'user_id' und Ihre in' to_user_id' gespeichert. Aber wenn Sie mir eine Nachricht schicken, wird meine als 'to_user_id' und Ihre als' user_id' gespeichert. –
Also wollen Sie, sagen wir, eine Methode, wo Sie 'getMessagesSentBetweenUserIds (1, 2)' tun können und es wird Ihr '$ threads' Array zurückgeben? Oder versuchen Sie, alle Nachrichten für alle Benutzer auf einmal zu erhalten? Denn wenn Sie nur Ihre "sentByUser" - und "receivedByUser" -Methoden verwenden, die Sie jetzt haben, könnten Sie möglicherweise Nachrichten von anderen Nutzern außerhalb von 1 und 2 einziehen, was Sie nicht wollen. – Samsquanch