У меня есть 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);
Любая помощь будет принята с благодарностью Дэнни