2016-04-12 13 views
0

申し訳ありませんが、これは説明するのが少し複雑ですが、基本的には:スレッドテーブルには多くのメッセージがあります。スレッドは、これらの列があります。Laravel - "WhereHas"クエリ:ユーザーごとに異なる

id, deleted_at_sender, deleted_at_receiver_ sender_id, receiver_id 

メッセージテーブルは、私は、スレッドが送信されたユーザーによって削除されていないスレッドを取得しようとしています、これらの列の私のクエリで

thread_id, user_id, body 

を持っていますに。たとえば、user1user2にメッセージを送信した場合、user2はそれを削除でき、表示することはできませんが、user1はまだ表示されます。

(一種の)私はすでに設定そのクエリを持っているし、それが完璧に動作

$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); 

どこに求めることができる問題がありますか?この行は$q->whereNull('deleted_at_receiver');です。現在ログインしているユーザーがメールの受信者か送信者かによって、実際には入力できません。今のところ、この行にはdeleted_at_receiverという列がハードコードされています。

スレッドが現在ログインしているユーザーによって作成されたかどうかを判断し、ユーザーが送信者か受信者かによって、$q->whereNull('deleted_at_receiver');を変更する方法を見つけ出す必要があります。

ご協力いただきまして誠にありがとうございます。私は運がないとこれを把握しようと2日以上過ごしました。みんな助けてください。

ありがとうございます。

答えて

0

残りの部分を見ることなく、若干高度なクエリを使用して解決できるように思えます。私は100%確信していませんが、これはあなたの後にあるものです。

->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); 
    }); 
}) 

おそらく、句としてwhereNested()を使用する必要があります。しかし、私はそれが動作するかどうかを確認することができないか、現時点でさらにコメントすることが恐れている。うまくいけば、それは少なくともあなたが正しい方向に進むようになるでしょう。 :)

関連する問題