【问题标题】:Laravel 5.1 - Querying pivot table using eloquentLaravel 5.1 - 使用 eloquent 查询数据透视表
【发布时间】:2015-09-30 01:32:03
【问题描述】:

我正在使用 laravel 5.1 进行 CMS 开发。我有一个简单的帖子结构,用户和用户可以喜欢帖子。

帖子和用户具有多对多关系,并使用数据透视表进行关系。

帖子模型有

public function likedby()
{
    return $this->belongsToMany('App\Models\User','user_like_post')
        ->withTimestamps();
}

用户模型有

public function likes(){
    return $this->belongsToMany('App\Models\Post','user_like_post')
        ->withTimestamps();
}

我想列出用户的最新活动。例如

  1. Username1 喜欢 Post2
  2. Username5 点赞 Post9
  3. Username30 点赞 Post25

我知道我必须写一个这样的 sql 查询 -

mysql > select users.name, posts.heading from user_like_post as ulp 
      > join users on ulp.user_id=users.id 
      > join posts on ulp.post_id=posts.id 
      > order by ulp.created_at desc limit 10;

上面的查询工作正常,但是有没有办法使用 laravel eloquent 做到这一点?

【问题讨论】:

    标签: laravel eloquent laravel-5


    【解决方案1】:

    如果你想要纯粹的雄辩的解决方案,那么你需要额外的数据透视表模型:

    class PostUser extends Model {
      protected $table = 'user_like_post';
      public function post()
      {
        return $this->belongsTo(Post::class);
      }
    
      public function user()
      {
        return $this->belongsTo(User::class);
      }
    }
    
    // then something like this
    $activity = PostUser::latest()->take(10)->get();
    
    @foreach ($activity as $action)
      {{ $action->user->name }} likes {{ $action->post->title }}
    @endforeach
    

    除此之外,您还需要joins 才能按数据透视表对结果进行排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-11
      • 2015-06-24
      • 2015-12-28
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      相关资源
      最近更新 更多