Laravel, где или где-нибудь в главном столе сводная таблица - PullRequest
0 голосов
/ 02 июня 2018

У меня есть две таблицы с отношением ownToMany: message_topics и пользователей

Сводная таблица message_topics_users и содержит 2 столбца: message_id иuser_id.

В таблице message_topics у меня есть поле с именем sender_id

Я пытаюсь написать правильный красноречивый синтаксис, чтобы получить всезаписи:

, где message_topics.sender_id = $ user_id ИЛИ Message_topics_users.receiver_id = $ user_id

Я пробовал много вещей, например, например:

$topics = MessageTopic::where('sender_id', $user_id)
    ->wherePivot('receiver_id', $user_id)->orderBy('sent_at','desc')->get();

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Я предполагаю, что у вас есть две связи из тем?Так как слишком произвольно использовать оба столбца и одно и то же отношение ... Например,

//On your MessageTopic model
public function sender(){
    return $this->belongsToMany('App\User', 'message_topics_users', 'message_id', 'sender_id');
}

public function receiver(){
    return $this->belongsToMany('App\User', 'message_topics_users', 'message_id', 'receiver_id'));
}

Тогда вы можете использовать whereHas и orWhereHas, например:

//Again assuming you have your User model loaded as $user
$topics = App\Topic::whereHas('sender', function($q) use($user){
    $q->where('sender_id', '=', $user->id);
})
->orWhereHas('receiver', function($q) use($user){
   $q->where('receiver_id', '=', $user->id
})
->orderByDesc('sent_at')
->get();

whereHas и orWhereHas оба запрашиваютмодель (в данном случае MessageTopic), проверяющая наличие указанной связи (App\Topic::whereHas('sender')...).Они также позволяют вам пройти ограничение, которое вы ищете (function($q) use($user){ $q->... })

Таким образом, в основном говорится: «Дайте мне ТОЛЬКО MessageTopics, у которых есть Отправитель или Получатель с идентификатором $user->id»

0 голосов
/ 02 июня 2018

Вы можете использовать метод whereHas (или в данном случае метод orWhereHas):

$topics = MessageTopic::where('sender_id', $user_id)
    ->orWhereHas('users', function ($query) use ($user_id) {
        $query->where('id', $user_id);
    })
    ->orderBy('sent_at', 'desc')
    ->get();
...