Записать из базы данных значение в переменную Laravel

public function index(){
     $user=auth()->user();
             return view('admin.articles.index',[
              'articles' => Article::with(['user' => function ($query) {  $query->where('role_id','=', 1)->where('role_id','=', 3);}])- 
             >orderBy('created_at', 'desc')->paginate(10, ['*'], 'main_user_table'),

         'articles_suggest' => Article::with(['user' => function ($query) {  $query->where('role_id', 2) ;}])- 
              >orderBy('created_at', 'desc')->paginate(10, ['*'], 'suggestion_user_table'),
        ]);
}

Я хочу вывести данные статей, у которых автор будет через таблицу пользователей role_id = 1 и 3 , но почему то в переменную записывается прям всё ,все статьи , а когда я пытаюсь через IF проверить , то всегда вторая страница пустая, у первой 2 записи , все остальные на третий странице. Мне просто нужно , чтобы в переменную articles записалось только, только , только записи у который автор по роли 1 или 3 . Я не понимаю что не так...

 @forelse ($articles as $article)
      @if (isset($article->user->role_id))
         @if (($article->user->role_id!=2))
            <tr>
              <td>{{$article->title}}</td>
             <td>{{$article->published}}</td>
            </tr>
        @endif
    @endif
  @empty

Article model

public function user(){
    return $this->belongsTo(User::class, 'author_id');
  }

User model

public function articles(){
        return $this->hasMany('App\Article');
    }

index.php

   public function index(){
     $user=auth()->user();
      return view('admin.articles.index',[
         'articles' => Article::with('user')->whereHas('user', function ($query) { $query->whereIn('role_id', [1,2]); } )->orderBy('created_at', 'desc')->paginate(10, ['*'], 'main_user_table'),

    }

Ответы (1 шт):

Автор решения: Nikita Noskov
  1. В этом фрагменте кода запрашиваются все записи Article. Указанный внутри запрос применяется только при загрузке отношения user.
Article::with(['user' => function ($query) {  $query->where('role_id','=', 1)->where('role_id','=', 3);}])
  1. В этом фрагменте кода у вас будет сгенерирован sql вида where role_id = 1 and role_id = 3, я бы предложил вам where role_id in (1, 3).
$query->where('role_id','=', 1)->where('role_id','=', 3);
  1. Для решения вашей задачи можно воспользоваться методом whereHas, с которым можно подробнее ознакомиться в документации Laravel. В вашем случае достаточно будет заменить код, который я указал в пункте 1 на этот.
Article::with('user')->whereHas('user', function ($query) {
    $query->whereIn('role_id', [1, 3]);
});
→ Ссылка