Laravel красноречивый запрос, объединяющий 3 таблицы - PullRequest
0 голосов
/ 29 марта 2020

У меня есть 3 таблицы, которые я хочу запросить

newfeeds
- id
- user_id

group_newsfeed
- newfeed_id
- group_id

newsfeed_supplier
- newsfeed_id
- supplier_id

Я хочу отобразить ленту новостей для пользователя, показывая сообщения пользователей, за которыми они следят, и сообщения, которые были опубликованы в группе или поставщике, которые пользователь также подписан Не требуется присваивать сообщения группам или поставщикам

Я пытаюсь создать laravel красноречивый запрос, который дает мне эти результаты для отображения каналов.

Я создал следующие отношения в модели Newsfeed

public function groups()
{
    return $this->belongsToMany('App\Group');
}

public function suppliers()
{
    return $this->belongsToMany('App\Supplier');
}

public function group_newsfeed()
{
    return $this->belongsToMany('App\Group', 'group_newsfeed', 'newsfeed_id', 'group_id');
}

public function newsfeed_supplier()
{
    return $this->belongsToMany('App\Supplier', 'newsfeed_supplier', 'newsfeed_id', 'supplier_id');
}

Следующие отношения в модели группы

public function newsfeeds()
{
    return $this->belongsToMany('App\Newsfeed');
}

public function groups()
{
    return $this->belongsToMany('App\Group', 'group_newsfeeds', 'newsfeed_id', 'group_id');
}

И следующие отношения в модели поставщика

public function newsfeeds()
{
    return $this->belongsToMany('App\Newsfeed');
}

public function suppliers()
{
    return $this->belongsToMany('App\Supplier', 'newsfeed_supplier', 'newsfeed_id', 'supplier_id');
}

Upfront I иметь информацию о пользователях, друзьях и группах + поставщиках, за которыми они следят.

Я попытался выполнить следующий запрос

$newsfeeds = Newsfeed::with('module', 'groups', 'suppliers')
        ->whereHas('group_newsfeed', function ($query) use ($groups_followed){
            $query->whereIn('group_newsfeed.group_id', $groups_followed->pluck('id'));
        })
        ->orWhereHas('newsfeed_supplier', function ($query) use ($suppliers_followed){
            $query->whereIn('newsfeed_supplier.supplier_id', $suppliers_followed->pluck('id'));
        })
        ->orWhereNotIn('newsfeeds.id', function($query) use ($groups_followed){
            $query->select('newsfeed_id')
                ->from('group_newsfeed')
                ->whereIn('group_newsfeed.group_id', $groups_followed->pluck('id'));
        })
        ->orWhereNotIn('newsfeeds.id', function($query) use ($suppliers_followed){
            $query->select('newsfeed_id')
                ->from('newsfeed_supplier')
                ->whereIn('newsfeed_supplier.supplier_id', $suppliers_followed->pluck('id'));
        })
        ->orderBy('created_at', 'desc')->paginate(10);

Любая помощь будет принята с благодарностью Дэнни

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...