2016-04-12 7 views
0

Sorry, das ist ein bisschen kompliziert zu erklären, aber im Grunde: Die Thread-Tabelle hat viele Nachrichten. Ein Thread diese Spalten:Laravel - "WhereHas" -Abfrage: für jeden Benutzer anders

id, deleted_at_sender, deleted_at_receiver_ sender_id, receiver_id 

Die Nachrichten-Tabelle hat diese Spalten

thread_id, user_id, body 

Mit meiner Anfrage, ich versuche, die Fäden zu erhalten, die nicht vom Benutzer gelöscht hat, das der Thread gesendet wurde zu. Zum Beispiel, wenn user1 sendet eine Nachricht an user2, user2 kann es löschen und er sollte nicht in der Lage sein, es zu sehen, während user1 sollte immer noch in der Lage, es zu sehen.

Ich habe diese Abfrage bekam bereits eingerichtet und es funktioniert einwandfrei (Art)

$messages = Message::select('*', \DB::raw('max(created_at) as created_at')) 
     ->where($get_user_id, uid()) 
     ->groupBy('thread_id') 
     ->orderBy('created_at', 'desc') 
     ->whereHas('thread', function ($q) { 
      $q->whereNull('deleted_at_receiver'); 
     }) 
     ->paginate(10); 

Wo ist das Problem, das Sie fragen? Es ist diese Zeile: $q->whereNull('deleted_at_receiver');. Sie sehen, je nachdem, ob der aktuell angemeldete Benutzer der Empfänger oder Absender der Mail ist, kann ich das nicht wirklich ausfüllen. Für den Moment habe ich die deleted_at_receiver Spalte an dieser Zeile hartkodiert.

Ich muss irgendwie herausfinden, wie der Thread von dem aktuell angemeldeten Benutzer erstellt wurde und ändern Sie $q->whereNull('deleted_at_receiver'); je nachdem, ob der Benutzer der Absender oder der Empfänger ist.

Jede Hilfe wird sehr geschätzt. Ich habe über 2 Tage damit verbracht, das herauszufinden, ohne Glück. Bitte helfen Sie Jungs.

Vielen Dank.

Antwort

0

Ohne den Rest der Abfrage zu betrachten, klingt, als könnten Sie das mit etwas fortgeschritteneren Abfragen lösen. So etwas vielleicht, obwohl ich mir nicht 100% sicher bin, dass du danach suchst.

->whereHas('thread', function ($q) use ($user_id) { 
    $q->where(function ($q) use ($user_id) { 
     $q->whereNull('deleted_at_receiver') 
      ->where('receiver_id', $user_id); 
    })-orWhere(function ($q) use ($user_id) { 
     $q->whereNull('deleted_at_sender') 
      ->where('sender_id', $user_id); 
    }); 
}) 

Vielleicht müssen Sie whereNested() für die oder Klausel verwenden. Aber leider kann ich im Moment nicht überprüfen, ob es funktioniert oder einen Kommentar abgibt. Hoffentlich bringt es dich wenigstens in die richtige Richtung. :)

Verwandte Themen