如何在 Laravel 5.8 中获取关注用户的帖子

Posted

技术标签:

【中文标题】如何在 Laravel 5.8 中获取关注用户的帖子【英文标题】:How to get following users posts in Laravel 5.8 【发布时间】:2020-05-11 14:42:52 【问题描述】:

我的 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);
   

【问题讨论】:

【参考方案1】:

我认为你需要做的是这个。

不确定,但在某些 Laravel 版本中,您必须在此处使用 select 而不是 pluck。此 defo 适用于 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 的文档 向下滚动一点,whereIn 上没有直接锚点:-)

【讨论】:

非常感谢。可以的,能不能告诉我用什么sql语句来实现呢。 什么意思?顺便说一句...在 Laravel 5.6 中,pluck() 在 5.8 中不确定 我如何使用原始 SQL 查询来做到这一点? 你可以调试 Eloquent 创建的查询,看看这篇文章 scotch.io/tutorials/debugging-queries-in-laravel 但是你为什么要在原始 sql 中这样做呢?【参考方案2】:

找到/选择用户后,您可以通过以下方式获取相关帖子:

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

为此,您必须在posts 表中有user_id 列。

如果你想拥有所有用户和他们的帖子,你可以这样做:

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

如果您只希望本质上至少有一个帖子的用户这样做,这将返回所有用户(无论他们是否有任何帖子):

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

【讨论】:

以上是关于如何在 Laravel 5.8 中获取关注用户的帖子的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.1-5.8 中以前的路线名称

Laravel 5.8 如何获得工作 ID?

如何在关系表laravel 5.8中解码Json数据

Laravel 5.8:如何在 Global Scope 的 apply 方法中解析 auth()->user()?

如何在 laravel 5.8 中合并两个 sql 表

Laravel 5.8刀片,从嵌套对象错误中获取值