Как получить посты следующих пользователей в Laravel 5.8 - PullRequest
0 голосов
/ 25 января 2020

У меня есть две модели в моем проекте Laravel 5.8 , отношения показаны ниже в обоих модельных классах. Как я могу получить записи о каждом отдельном посте, связанные с каждым пользователем, за которым я следую, используя только один sql запрос? Могу ли я получить его с помощью Eloquent Query Builder или мне нужен Raw SQL Query ? Может кто-нибудь показать мне запрос SQL, чтобы сделать это?

Извините, я не знаю, какой заголовок поставить в вопросе.

Заранее спасибо!

Класс пользователя.

class User extends Authenticatable implements MustVerifyEmail{

   use Notifiable, MessageAccessible, TagsCreator;

   /**
    * The attributes that are mass assignable.
    *
    * @var array
    */
   protected $fillable = [
      'name',
      "lastname",
      "country",
      "city",
      "phone_number",
      'e_mail',
      'password',
      "role_id",
      "profile_picture",
      "occupation",
      "biography"
   ];

   /**
    * The attributes that should be hidden for arrays.
    *
    * @var array
    */
   protected $hidden = [
      'password',
      'remember_token'
   ];

   /**
    * The attributes that should be cast to native types.
    *
    * @var array
    */
   protected $casts = ['email_verified_at' => 'datetime'];

   public function posts(){
      return $this->hasMany(Post::class);
   }

   public function followers(){
      return $this->belongsToMany(User::class, 'follower_followed', 'followed_id', 'follower_id');
   }

   public function following(){
      return $this->belongsToMany(User::class, 'follower_followed', 'follower_id', 'followed_id');
   }
}

Класс сообщения.

class Post extends Model{

   /**
    * The attributes that are mass assignable.
    *
    * @var array
    */
   protected $fillable = [
      'user_id',
      "post_permission_id",
      "title",
      "content",
      "likes",
      "dislikes"
   ];

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

Ответы [ 2 ]

1 голос
/ 25 января 2020

Я думаю, что вам нужно сделать это.

Не уверен, но в некоторых Laravel версиях вы должны использовать select вместо pluck здесь. Этот дефо работает в 5.6

$posts = Post::whereIn('user_id', User::find($user_id)->followers->pluck('id'))->get();

, тогда вы можете заказать посты следующего подписчика

$posts = Post::whereIn('user_id', User::find($user_id)->followers->pluck('id'))->orderBy('user_id', 'ASC')->get();

Вот документация для , где в Прокрутите немного вниз, там не является прямой привязкой к whereIn: -)

1 голос
/ 25 января 2020

После нахождения / выбора пользователя вы можете получить соответствующие сообщения с чем-то вроде этого:

$user = Auth::user(); // selecting the logged in user
$user->posts;

Чтобы это работало, у вас должен быть столбец user_id в таблице posts.

И если вы хотите, чтобы все пользователи и их сообщения, вы можете сделать это:

$usersWithPosts = User::with('posts')->get();

Это вернет всех пользователей (независимо от того, есть ли у них сообщение или нет), если вы просто хотите, чтобы пользователи которые, по сути, имеют хотя бы один пост, делают это:

$usersWithPosts = User::has('posts')->get();
...